SQLServer 聚集索引優化方案

2021-06-19 05:29:44 字數 1296 閱讀 2520

最近接到客戶提報的問題:無線上傳的資料,伺服器處理速度太慢了,300條資料處理了10分鐘。

太誇張了!分析原因發現同事在匯入這個系統時是按照原來專案資料庫生成的指令碼,可是沒有發現這些指令碼都沒有索引。

發現這個問題後,我大悅。立馬按照原來的索引生成後給了客戶,客戶反映提高很多!

可是用了沒多長時間,同乙個客戶又提出慢,百般尋求答案,無解。

後來我把資料庫索引全部刪掉,按照給客戶的索引重新建立,發現沒有聚集索引,我再看指令碼,聚集索引在非聚集索引後面就變成非聚集了。

汗!後來調整後300條記錄,需要5s,儘管履歷已經存在100多萬,在插入時要用到3個100萬的資料檢索(3個表),現在這個速度已經可以了。

一、主鍵與聚集索引並不是一對一匹配的

一般情況下我們都認為,聚集索引和主鍵是相互匹配的,因為只要你在sqlserver表中定義了乙個主鍵,那麼sqlserver會為這個主鍵自動新增聚集索引.但是,如果你先在表中基於任意一列建立聚集索引,然後再選擇另一列作為主鍵,這時,這個sqlserver將會基於這個主鍵建立乙個唯一非聚集索引.

二、聚集索引會被應用到每個查詢中

乙個sqlserver表內,最多只能有乙個聚集索引,並且表中資料行儲存的位置由聚集索引來決定.表中非聚集索引與資料行的對映,是通過聚集索引來定位的.當聚集索引執行插入操作時,資料表中的行要進行移動,同時該表中所有非聚集索引要重新排列,這是非常消耗資源並且影響sqlserver響應速度的.

所以sqlserver表中的聚集索引一定要避免新新增資料時執行插入操作,保證表中新新增的資料是從索引的尾部追加的.這樣做可以保證聚集索引相對靜態,對非聚集索引的影響也會減小.

建立聚集索引時,要選擇那些資料會不斷增加的字段,最好的例子就是bbs發帖表中,帖子發布時間,這個欄位中的資料是隨時間增長的,理論上講是不會重複的,最適合建立聚集索引.

如果你的聚集索引真的做到了不斷增加,那麼它的填充因子就應該是100%,這個數值越高,每個8kb大小的索引頁記錄的行數就越多,進行相同的掃瞄時io、記憶體和cpu資源就用的越少,換句話說就是查詢效率更高.

三、聚集索引的資料型別位寬將影響查詢效率

聚集索引列的資料型別位寬越小,查詢效率越高,並且由於非聚集索引是依靠聚集索引來影射sqlserver表中資料行的,聚集索引的位寬必將影響表中所有非聚集索引的大小.通常適合作為聚集索引的型別包括:

smallint, int, bigint, datetime 和 uniqueidentifier.

sqlserver 聚集索引 非聚集索引

聚集索引是一種對磁碟上實際資料重新組織以按指定的一列或者多列值排序。像我們用到的漢語字典,就是乙個聚集索引。換句話說就是聚集索引會改變資料庫表中資料的存放順序。非聚集索引不會重新組織表中的資料,而是對每一行儲存索引列值並用乙個指標指向資料所在的頁面。乙個值指向多行等於該值的資料 sqlserver預...

SQL SERVER 聚集索引 非聚集索引 區別

一 理解索引的結構 索引在資料庫中的作用類似於目錄在書籍中的作用,用來提高查詢資訊的速度。使用索引查詢資料,無需對整表進行掃瞄,可以快速找到所需資料。微軟的sql server提供了兩種索引 聚集索引 clustered index,也稱聚類索引 簇集索引 和非聚集索引 nonclustered i...

sql server聚集索引與非聚集索引

於 sql server聚集索引與非聚集索引 筆記 雜,淺顯理解 聚集索引按順序查詢 拼音目錄 非聚集索引不按順序查詢 部首目錄 每個表只能有乙個聚集索引,因為目錄只能按照一種方法進行排序。返回某範圍內的資料一項。比如您的某個表有乙個時間列,恰好您把 聚合索引建立在了該列,這時您查詢2004年1月1...