2011-03-14 54 views
1

我一直在開發查詢以使用DMV獲取索引碎片信息。T-SQL查詢獲取索引碎片信息

但是,查詢給出的結果比預期的要多。我相信問題在於聯結。

有什麼想法?

select distinct '['+DB_NAME(database_id)+']' as DatabaseName, 
    '['+DB_NAME(database_id)+'].['+sch.name+'].[' 
    + OBJECT_NAME(ips.object_id)+']' as TableName, 
    i.name as IndexName, 
    ips.index_type_desc as IndexType, 
    avg_fragmentation_in_percent as avg_fragmentation, 
    SUM(row_count) as Rows 
FROM 
    sys.indexes i INNER JOIN 
    sys.dm_db_index_physical_stats(NULL,NULL,NULL,NULL,'LIMITED') ips ON 
     i.object_id = ips.object_id INNER JOIN 
    sys.tables tbl ON tbl.object_id = ips.object_id INNER JOIN 
    sys.schemas sch ON sch.schema_id = tbl.schema_id INNER JOIN 
    sys.dm_db_partition_stats ps ON ps.object_id = ips.object_id 
WHERE 
    avg_fragmentation_in_percent <> 0.0 AND ips.database_id = 6 
    AND OBJECT_NAME(ips.object_id) not like '%sys%' 
GROUP BY database_id, sch.name, ips.object_id, avg_fragmentation_in_percent, 
    i.name, ips.index_type_desc 
ORDER BY avg_fragmentation_in_percent desc 

回答

1

我認爲你需要index_id的在對sys.dm_db_partition_statssys.indexes連接。

使用sys.dm_db_index_physical_stats的第一個參數來篩選db而不是where子句ips.database_id = 6可能更好。

我不明白distinct,group bysum(row_count)子句。

這是一個查詢,你可以嘗試看看它是否做你想要的。

select 
    db_name(ips.database_id) as DataBaseName, 
    object_name(ips.object_id) as ObjectName, 
    sch.name as SchemaName, 
    ind.name as IndexName, 
    ips.index_type_desc, 
    ps.row_count 
from sys.dm_db_index_physical_stats(6,NULL,NULL,NULL,'LIMITED') as ips 
    inner join sys.tables as tbl 
    on ips.object_id = tbl.object_id 
    inner join sys.schemas as sch 
    on tbl.schema_id = sch.schema_id 
    inner join sys.indexes as ind 
    on ips.index_id = ind.index_id and 
     ips.object_id = ind.object_id 
    inner join sys.dm_db_partition_stats as ps 
    on ps.object_id = ips.object_id and 
     ps.index_id = ips.index_id