Sql-Server

為什麼我的索引變小了?

  • January 15, 2018

我有以下 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

立即想到三種可能性:

  • 也許有人刪除了索引?您應該創建一個也按索引對其進行分解的查詢。這些結果中缺少的一行比數字變化要明顯得多。
  • 過濾的索引,以及顯著減少索引中包含的行數的數據更改。
  • 碎片 - 最近是否針對此表或其任何索引執行了碎片整理或重建?即使行數和索引本身沒有改變,這也可以大大減少索引使用的頁數。

另外,為什麼它不影響數據庫的大小?因為數據庫只是一個容器,它不會因為您刪除數據或移動數據而自動收縮(除非您設置了自動收縮,您絕對不應該這樣做!)。想想你的房子:如果你清理地下室的雜物,你的房子就不會縮小!您也不希望您的數據庫執行此操作。所有這一切都是在您添加更多數據時導致數據文件再次增長。還有什麼比這更浪費的呢?您暫時釋放了一些空間,只是為了讓使用者事務在您再次使用它時等待。耶?

無論如何,您的整體數據大小似乎保持不變,因此我假設發生了兩件事:您添加了對數據大小有顯著影響的一百萬行,並且發生了一些索引維護,大大減少了索引大小。最後,我們無法告訴您是什麼原因造成的,因為我們無權訪問您的系統。我們只能胡亂猜測,你必須弄清楚哪些是堅持的。

引用自:https://dba.stackexchange.com/questions/54616