ms sqlserver數據庫建索引


 

索引分類:從物理結構上可分為兩種:聚集索引和非聚集索引 (此外還有空間索引、篩選索引、XML索引)

 

因為聚集索引是索引順序與物理存儲順序一致,所以只能建一個。

  • 聚集索引就是把數據按主鍵順序存儲;
  • 因為一張表中的數據只能有一個物理順序,所以一張表只能有一個主鍵/聚集索引。

非聚集索引可以建1或者N個。

並不是所有字段上都可以建索引,有的字段類型如text、image、nvarchar(max)等是不可以建索引的。

sql語句有多個條件用and連接時,多個字段都有索引的話,順序很重要。

 

索引是存在磁盤的文件,一個表上如果有100個列,但是不能建太多索引,因為進行插入,修改,刪除時都需要對索引文件進行修改,會影響增刪改的效率,所以要平衡索引的個數。

 

索引的數據結構長什么樣子呢?

文章:SQL Server 索引(一)數據結構和存儲結構

講了索引概念和結構。

在SQL Server數據庫中,索引的存儲是以B+樹(注意和二叉樹的區別)結構來存儲的,又稱索引樹,其節點類型為如下兩種:

  • 索引節點;
  • 葉子節點

索引節點按照層級關系,有時又可以分為根節點和中間節點,其本質是一樣的,都只包含下一層節點的入口值和入口指針;

葉子節點就不同了,它包含數據,這個數據可能是表中真實的數據行,也有可能是索引列值和行書簽,前者對應於聚集索引,后者對應於非聚集索引。

通過DBCC IND命令來查看索引的情況

DBCC IND ([PCT], [DBO.Employee], -1)

具體例子可以到上文的博客處查看。

 

非聚集索引的include理解,這個索引的數據結構息息相關。

  • 索引覆蓋和非聚集索引的根節點和中間節點一樣,都是索引頁,都只包含下一層的入口指針和入口值。
  • 索引覆蓋的葉節點卻稍有不同,多了一列DepartmentCode,此列即為索引覆蓋列,而且此列只在葉節點出現,如果查詢時,只需返回鍵值列和索引覆蓋列,則只需索引查找,肯本無需訪問數據頁,不僅提高了性能,而且節省占用空間。

 

本次優化記錄:

1,把多個and order_State<>2 and order_State<>-1and order_State<>-10and order_State<>-20等修改成,and order_State not in(-20,-10,-1,2)查詢速度快了很多。

2,在DateTime字段上建了索引,又提高了幾秒。

 

下面的表格闡述了什么時候應該用非簇聚索引,什么時候用簇聚索引:

 

動作描述 使用聚集索引 使用非聚集索引
列經常被分組排序
返回某范圍內的數據 不應
一個或極少不同值 不應 不應
小數目的不同值 不應
大數目的不同值 不應
頻繁更新的列 不應
外鍵列
主鍵列
頻繁修改索引列 不應

 

把流水表修改成一個單表,增加字段數,嘗試優化。

文章:SQL Server基礎之索引  待閱讀。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM