2011-03-14 41 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