通過前面二篇文章我們基本學會了如何結合執行計劃分析出某Sql語句的性能問題,既然有性能問題的地方已經找到了,接下來就是如何優化查詢來提高查詢性能,而優化查詢最重要的武器就是建立索引,這篇文章就來總結如何建立索引來提高查詢速度,主要從以下幾個方面來總結。
了解索引
建立索引的文法
結合執行個體示範如何建立索引
1,索引是什麼?
在Sql Server中,索引是一種增強式的存在,這表示即使沒有索引,Sql Server的功能并不會受到影響。索引是對資料庫表中一列或多列的值進行排序的一種結構(B樹),使用索引可快速通路資料庫表中的特定資訊。
2,為什麼要使用索引?
就是提高查詢性能。
3,有哪些索引?
主要分為聚集索引(CLUSTERED INDEX)和非聚集索引(NONCLUSTERED INDEX)兩種,聚集索引指的是一列或多列的實體順序和邏輯順序是一緻的,一個資料庫表隻能有一個聚集索引,我們通常将主鍵(一般為自增int型)設為聚集索引。而非聚集索引則可以有多個,而且非聚集索引并不會改變資料庫表的實體結構。
1,建立索引,sql文法如下。
2,删除索引,sql文法如下。
表結構如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauEDZ2UTY4cDNjFWO1UDN1UWN5YjYyUmY0gTZjFGZ1QWZfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.jpg)
現在的需求是,查詢2006年7月1日到2007年7月31日的所有訂單,并按requireddate字段排序,查詢sql代碼如下:
注意,這個表隻有主鍵orderid的聚集索引外,沒有建立任何索引。執行查詢檢視執行計劃,如下圖。
從上面的執行計劃可以看出,在排序和聚集索引查找方面比較耗時。首先看排序,因為是by requireddate排序的,是以對requireddate字段要建立單個字段索引,代碼如下。
然後因為where條件中是按orderdate字段來限定範圍的,是以對orderdate字段要建立單個字段索引,代碼如下。
因為要查詢的字段為orderid,orderdate,requireddate,shippeddate,shipname,shipaddress,是以我們可以針對這幾個字段建立一個組合字段索引,代碼如下。
最後,我們再重新運作一次查詢,檢視執行計劃,如下圖。
從執行計劃中可以看到,後面那個已經變成了非聚集索引查詢了,說明我們建立的索引起作用了。具體是建立單個字段索引,組合字段索引還是兩個都要建立,這個要在實際的項目中反複試驗。