Sql-Server
為什麼我的索引變小了?
我有以下 SP,我編寫它來計算數據庫上所有表的大小
SELECT name,dbo.nice(rows) as [rows], dbo.nice(CAST(total-indexes as DECIMAL)/1024) as [data (MB)], dbo.nice(CAST(indexes as DECIMAL)/1024) as [indexes (MB)], dbo.nice(CAST(total as DECIMAL)/1024) as [total (MB)] FROM ( Select A.name,rows ,SUM(CASE B.indid WHEN 1 THEN B.used ELSE 0 END)*8 as [total] ,SUM(CASE B.indid WHEN 1 THEN 0 ELSE B.used END)*8 as [indexes] from sysobjects A (nolock), sysindexes B (nolock) where A.id = b.id and A.type = 'u' and rows > 0 group by A.name,rows ) as [d] order by total desc
我不記得我在哪裡得到這個。我寫了外面的部分,並在網上某處找到了裡面的部分。
無論如何,它的伎倆。它通過減去索引來計算我的數據大小。今天當我執行 SP 並將其與幾天前的結果進行比較時,我感到震驚
table rows data (MB) indexes (MB) total (MB) MyBigTable 240,106,454 35,428 33,001 68,429 // 4 days ago MyBigTable 241,442,655 57,128 11,559 68,688 // today
我的數據變大了!在檢查了 SP 原始碼並記住它是如何工作的之後,我當然意識到數據大小沒有改變(很多)。發生的事情是索引的大小急劇減小。
這是什麼原因造成的?我沒有對索引進行編輯。我沒有縮小數據庫或在其上執行任何會影響索引的東西。為什麼我的指數下降如此之大?為什麼它不影響數據庫的整體大小?
更新:
我查看了我的索引,發現其中一個嚴重分散,超過 80%。我重建了它,現在數據又跳了。這是新的統計數據。
table rows data (MB) indexes (MB) total (MB) MyBigTable 240,106,454 35,428 33,001 68,429 // 5 days ago MyBigTable 241,442,655 57,128 11,559 68,688 // yesterday MyBigTable 241,705,941 35,581 32,538 68,119 // today
立即想到三種可能性:
- 也許有人刪除了索引?您應該創建一個也按索引對其進行分解的查詢。這些結果中缺少的一行比數字變化要明顯得多。
- 過濾的索引,以及顯著減少索引中包含的行數的數據更改。
- 碎片 - 最近是否針對此表或其任何索引執行了碎片整理或重建?即使行數和索引本身沒有改變,這也可以大大減少索引使用的頁數。
另外,為什麼它不影響數據庫的大小?因為數據庫只是一個容器,它不會因為您刪除數據或移動數據而自動收縮(除非您設置了自動收縮,您絕對不應該這樣做!)。想想你的房子:如果你清理地下室的雜物,你的房子就不會縮小!您也不希望您的數據庫執行此操作。所有這一切都是在您添加更多數據時導致數據文件再次增長。還有什麼比這更浪費的呢?您暫時釋放了一些空間,只是為了讓使用者事務在您再次使用它時等待。耶?
無論如何,您的整體數據大小似乎保持不變,因此我假設發生了兩件事:您添加了對數據大小有顯著影響的一百萬行,並且發生了一些索引維護,大大減少了索引大小。最後,我們無法告訴您是什麼原因造成的,因為我們無權訪問您的系統。我們只能胡亂猜測,你必須弄清楚哪些是堅持的。