חיפוש באינטרנט אחר סקריפטים לחישוב גודל אינדקסים (storage size) מחזיר הרבה דוגמאות דומות המתבססות על טבלת המערכת sys.allocation_units (למשל כאן). הבעייה היא שהסקריפט מטפל באינדקסים "רגילים", וכך קרה שפיספסתי אינדקסים על XML..
החלופה היא לפנות לפונקציית המערכת sys.dm_db_index_physical_stats , למשל כך (טבלה מסויימת):
Select S.index_id,
(Select name From sys.indexes I Where I.object_id=Max(S.object_id) And
I.index_id=S.index_id),
8*Sum(page_count) 'Indexsize(KB)'
From sys.dm_db_index_physical_stats(DB_ID(),Object_ID('MyTbl'),Null,Null,Null) S
Group By index_id
Order By [Indexsize(KB)] Desc;
למה זה טוב? להרבה דברים, למשל – להתבסס עליו כדי לגלות את האינדקסים הלא מקומפרסים הכי גדולים:
With S As
(Select object_id,
S.index_id,
8*Sum(S.page_count) [Indexsize(KB)]
From sys.dm_db_index_physical_stats(DB_ID(),Null,Null,Null,Null) S
Group By S.object_id,
S.index_id)
Select Object_Schema_Name(S.object_id) SchemaName,
Object_Name(S.object_id) ObjectName,
I.name,
I.type_desc,
S.[Indexsize(KB)],
P.data_compression_desc
From S
Inner Join sys.indexes I (NoLock)
On S.object_id=I.object_id
And I.index_id=S.index_id
Inner Join sys.partitions P (NoLock)
On S.object_id=P.object_id
And S.index_id=P.index_id
Where data_compression_desc='NONE'
Order By [Indexsize(KB)] Desc;
ולבסוף – כיצד מקמפרסין אינדקס קיים? אין צורך לבצע Drop & Create או (עדיף) להיפך, אלא:
Alter Index Idx_MyTbl On MyTbl Rebuild With(Online=On,Data_Compression=Page);