SQL索引重建

2021-04-24 04:26:55 字數 2619 閱讀 8189

前2周出現一件怪異的事情。乙個新版本下發到生產環境之後,某個崗位的某個頁面展示異常的慢,展示達到了20秒,提交一筆頁面則達到了10秒......

問題都是這樣,當你過後覺得十分十分十分的簡單,但是當時對你來說簡直是暈頭轉向,一方面是行方不斷追問,另一方面是業務人員**都要打爆的質疑。在這樣環境下你需要的是冷靜的思考和邏輯的推斷去排查問題。

在排除了伺服器cpu,記憶體使用率瓶勁的可能之後,問題就集中在了資料庫查詢身上。聯絡業務部分和科技人員部分密碼管理員開啟資料庫的admin許可權,使用查詢事件探查器(sql-profiler)。再聯絡乙個業務在本地直接用localhost登入獲取頁面,同時執行sql-profiler,真的有新發現:發現該頁面執行某條語句去查詢某張view的時候十分的慢,duration達到了9000+,即9秒多。

這時候想起這次版本下發,針對這張view下的乙個table進行了全部刪除再匯入資料的操作(之前由於某些原因導致該錶資料冗餘,達到了原表大小的3倍,10w多條的記錄,匯入的資料來自和生產環境一樣的sit環境)。但是沒有考慮到對table進行索引重構。馬上要求發起業務維護申請,對該view下面的2個table進行reindex:

dbcc dbreindex (tablename1,index_name1)

dbcc dbreindex (tablename1,index_name2)

dbcc indexdefrag (tablename2,index_name3)

dbcc indexdefrag (tablename2,index_name4)

update statistics tablename1

update statistics tablename2

執行語句之後,該崗位業務恢復正常。一下是摘自網上文章:

解決碎片問題

一旦你確定表或索引有碎片問題,那麼你有

4個選擇去解決那些問題: 1.

刪除並重建索引

2.使用

drop_existing

子句重建索引

3.執行

dbcc dbreindex

4.執行

dbcc indexdefrag

儘管每乙個技術都能達到你整理索引碎片的最終目的,但各有各的優缺點。

刪除並重建索引

用drop index

和create index

或alter table

來刪除並重建索引有些缺陷包括在刪除重建期間索引會消失。在索引刪除重建時,對於查詢它不在可用,查詢效能也許會受到明顯的影響,直到重建索引為止。另乙個潛在的缺陷是當都請求索引的時候會引起阻塞,直到重建索引為止。通過其他的處理也能解決阻塞,就是索引被使用的時候不刪除索引。另乙個主要的缺陷是在用

drop index

和create index

重建聚集索引時會引起非聚集索引重建兩次。刪除聚集索引時非聚集索引的行指標會指向資料堆,聚集索引重建時非聚集索引的行指標又會指回聚集索引的行位置。

刪除並重建索引的確有乙個好處就是通過重新排序索引頁,使索引頁緊湊並刪除不需要的索引頁來完全重建索引。你也許需要考慮那些內部和外部碎片都很高的情況下才使用,以使那些索引回到它們應該在的位置。

使用drop_existing子句重建索引

為了避免在重建聚集索引時表上的非聚集索引重建兩次,可以使用帶

drop_existing

子句的create index

語句。這個子句會保留聚集索引鍵值,以避免非聚集索引重建兩次。和刪除並重建索引一樣,該方法也可能會引起阻塞和索引消失的問題。該方法的另乙個缺陷是也強迫你去分別發現和修復表上的每乙個索引。

除了和上乙個方法一樣的好處之外,該方法的好處是不必重建非聚集索引兩次。這樣可以對那些帶約束的索引提供正確的索引定義以符合約束的要求。

執行dbcc dbreindex

dbcc dbreindex

類似於第二種方法,但它物理地重建索引,允許

sqlserver

給索引分配新頁來減少內部和外部碎片。

dbcc dbreindex

也能動態的重建帶約束的索引,不象第二種方法。

dbcc dbreindex

的缺陷是會遇到或引起阻塞問題。

dbcc dbreindex

是作為乙個事務來執行的,所以如果在完成之前中斷了,那麼你會丟失所有已經執行過的碎片。

執行dbcc indexdefrag

dbcc indexdefrag

(在sqlserver2000

中可用)按照索引鍵的邏輯順序,通過重新整理索引裡存在的葉頁來減少外部碎片,通過壓縮索引頁裡的行然後刪除那些由此產生的不需要的頁來減少內部碎片。它不會遇到阻塞問題但它的結果沒有其他幾個方法徹底。這是因為

dbcc indexdefrag

跳過了鎖定的頁且不使用任何新頁來重新排序索引。如果索引的碎片數量大的話你也許會發現

dbcc indexdefrag

比重建索引花費的時間更長。

dbcc indexdefrag

比其他方法的確有好處的是在其他過程訪問索引時也能進行碎片整理,不會引起其他方法的阻塞問題。

sql重建索引一直執行 索引 sql執行慢續

之前有關sql語句執行變慢的原因解析中,提到過索引在sql語句執行過程中的作用 用的好,可以提高10倍左右的速度,提高效率,而用的不好,會降低效率。通過三個方面解析索引 索引的使用場景 索引種類 聚集索引和非聚集索引的查詢效率 續 在資料結構中的索引原理 索引就好比 本書的 錄,它可以幫我們快速進 ...

sql 重建索引 講深入淺出索引(下)

在下面這個表t中,如果我執行 select from t where k between 3 and 5,需要執行幾次樹的搜尋操作,會掃瞄多少行?下面是這個表的初始化語句。在k索引樹上找到k 3的記錄,取得 id 300 再到id索引樹查到id 300對應的r3 在k索引樹取下乙個值k 5,取得id...

DBCC DBREINDEX 重建索引

transact sql 參考 重建指定資料庫中表的乙個或多個索引。語法dbcc dbreindex database.owner.table name index name fillfactor with no infomsgs 引數 database.owner.table name 是要重建其...