如何建立索引

2021-09-22 20:49:51 字數 2869 閱讀 8685

原文:

如何建立索引

通過前面二篇文章我們基本學會了如何結合執行計畫分析出某sql語句的效能問題,既然有效能問題的地方已經找到了,接下來就是如何優化查詢來提高查詢效能,而優化查詢最重要的**就是建立索引,這篇文章就來總結如何建立索引來提高查詢速度,主要從以下幾個方面來總結。

了解索引

建立索引的語法

結合例項演示如何建立索引

1,索引是什麼?

在sql server中,索引是一種增強式的存在,這表示即使沒有索引,sql server的功能並不會受到影響。索引是對資料庫表中一列或多列的值進行排序的一種結構(b樹),使用索引可快速訪問資料庫表中的特定資訊。

2,為什麼要使用索引?

就是提高查詢效能。

3,有哪些索引?

主要分為聚集索引(clustered index)和非聚集索引(nonclustered index)兩種,聚集索引指的是一列或多列的物理順序和邏輯順序是一致的,乙個資料庫表只能有乙個聚集索引,我們通常將主鍵(一般為自增int型)設為聚集索引。而非聚集索引則可以有多個,而且非聚集索引並不會改變資料庫表的物理結構。

1,建立索引,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

2,刪除索引,sql語法如下。

-- 刪除索引

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;

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;

注意,這個表只有主鍵orderid的聚集索引外,沒有建立任何索引。執行查詢檢視執行計畫,如下圖。

從上面的執行計畫可以看出,在排序和聚集索引查詢方面比較耗時。首先看排序,因為是by requireddate排序的,所以對requireddate欄位要建立單個字段索引,**如下。

if not exists (select * from sysindexes where id=object_id('sales.orders') and name='idx_nc_requireddate')

create nonclustered index idx_nc_requireddate on sales.orders(requireddate);

go

然後因為where條件中是按orderdate欄位來限定範圍的,所以對orderdate欄位要建立單個字段索引,**如下。

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

因為要查詢的字段為orderid,orderdate,requireddate,shippeddate,shipname,shipaddress,所以我們可以針對這幾個字段建立乙個組合字段索引,**如下。

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...