原文:
如何建立索引
通過前面二篇文章我們基本學會了如何結合執行計畫分析出某sql語句的效能問題,既然有效能問題的地方已經找到了,接下來就是如何優化查詢來提高查詢效能,而優化查詢最重要的**就是建立索引,這篇文章就來總結如何建立索引來提高查詢速度,主要從以下幾個方面來總結。
了解索引
建立索引的語法
結合例項演示如何建立索引
1,索引是什麼?
在sql server中,索引是一種增強式的存在,這表示即使沒有索引,sql server的功能並不會受到影響。索引是對資料庫表中一列或多列的值進行排序的一種結構(b樹),使用索引可快速訪問資料庫表中的特定資訊。
2,為什麼要使用索引?
就是提高查詢效能。
3,有哪些索引?
主要分為聚集索引(clustered index)和非聚集索引(nonclustered index)兩種,聚集索引指的是一列或多列的物理順序和邏輯順序是一致的,乙個資料庫表只能有乙個聚集索引,我們通常將主鍵(一般為自增int型)設為聚集索引。而非聚集索引則可以有多個,而且非聚集索引並不會改變資料庫表的物理結構。
1,建立索引,sql語法如下。
-- 建立索引2,刪除索引,sql語法如下。if not exists (select * from sysindexes where id=object_id('sales.orders') and name='idx_nc_orderdate')
create nonclustered index idx_nc_orderdate on sales.orders(orderdate);
go
-- 刪除索引表結構如下:if exists (select * from sysindexes where id=object_id('sales.orders') and name='idx_nc_orderdate')
drop index idx_nc_orderdate on sales.orders;
go
現在的需求是,查詢2023年7月1日到2023年7月31日的所有訂單,並按requireddate欄位排序,查詢sql**如下:
use tsqlfundamentals2008;注意,這個表只有主鍵orderid的聚集索引外,沒有建立任何索引。執行查詢檢視執行計畫,如下圖。go-- 查詢2023年7月1日到2023年7月31日的所有訂單,並按requireddate欄位排序
select orderid,orderdate,requireddate,shippeddate,shipname,shipaddress from sales.orders
where orderdate>='20060701' and orderdate
order by requireddate;
從上面的執行計畫可以看出,在排序和聚集索引查詢方面比較耗時。首先看排序,因為是by requireddate排序的,所以對requireddate欄位要建立單個字段索引,**如下。
if not exists (select * from sysindexes where id=object_id('sales.orders') and name='idx_nc_requireddate')然後因為where條件中是按orderdate欄位來限定範圍的,所以對orderdate欄位要建立單個字段索引,**如下。create nonclustered index idx_nc_requireddate on sales.orders(requireddate);
go
if not exists (select * from sysindexes where id=object_id('sales.orders') and name='idx_nc_orderdate')因為要查詢的字段為orderid,orderdate,requireddate,shippeddate,shipname,shipaddress,所以我們可以針對這幾個字段建立乙個組合字段索引,**如下。create nonclustered index idx_nc_orderdate on sales.orders(orderdate);
go
if not exists (select * from sysindexes where id=object_id('sales.orders') and name='idx_orders_orderid_orderdate_shipaddress')最後,我們再重新執行一次查詢,檢視執行計畫,如下圖。create nonclustered index idx_orders_orderid_orderdate_shipaddress on sales.orders(orderid,orderdate,requireddate,shippeddate,shipname,shipaddress);
go
從執行計畫中可以看到,後面那個已經變成了非聚集索引查詢了,說明我們建立的索引起作用了。具體是建立單個字段索引,組合字段索引還是兩個都要建立,這個要在實際的專案中反覆試驗。
1,careyson的 t-sql查詢高階--理解sql server中索引的概念,原理以及其他
2,田園裡的蟋蟀的 程式設計師眼中的 sql server-執行計畫教會我如何建立索引?
如何建立索引
1.盡量在非常高的選擇性的列 或一組列 那麼希望第一列是最前沿最被重視的 建立聚集索引 2.比如索引建在int和nchar 3 型別的列上,那麼int及其int變種 bigint等 的索引效率要高於nchar 3 因為int的寬度要窄於nchar 3 3.建立索引的列 應該是值不能大多相同又不能完全...
哪些字段適合建立索引?如何建立索引
表的主鍵必須有索引 資料量超過300的表應該有索引 經常與其他表進行連線的表,在連線欄位上應該建立索引 經常出現在where子句中的字段,特別是大表的字段,應該建立索引 索引應該建在選擇性高的字段上 索引應該建在小字段上,對於大的文字字段甚至超長字段,不要建索引 a 正確選擇復合索引中的主列字段,一...
如何建立Lucene索引
需要用到的ipa indexwriter 這個是索引建立的中心元件,通過他就可以建立索引,它是生成索引的過程 與讀取和搜尋索引沒有關係 初始化化它時,需要傳遞的兩個引數。第乙個是引數是指定索引建立的位置,第二是引數是配置分詞器。document 這個文字相當於資料庫中的一條記錄,它裡面需要新增fie...