在整个SQL Server数据库上获取统计信息的最有效方法


8

我想要做的是查看我们的数据库并锁定所有auto-shrink设置,并掌握数据库/表高度分散的情况。

我是否可以运行特定的脚本来了解每个数据库的好主意?

我知道我可以在每个表级别(至少是SQL Server 2005)上运行以下命令:

DBCC SHOWCONTIG ('DB.TABLE');

但是如何运行才能显示数据库中的所有表?

谢谢

Answers:


6

要在2005/2008中检查碎片,可以使用以下脚本。您需要设置@DB@Table值。如果您将它们定义为,NULL那么它将在所有数据库和/或所有表上运行。如果执行单个数据库,请确保在该数据库的上下文(USE MyDB)中执行。

SELECT 
    object_name(IPS.object_id) AS [Table Name], 
    SI.name AS [Index Name], 
        CASE IPS.Index_type_desc
            WHEN 'CLUSTERED INDEX' THEN 'Clustered'
            ELSE 'Non-Clustered'
        END AS 'Index Type', 
    IPS.avg_fragmentation_in_percent as 'Avg Fragmentation (%)', 
    IPS.avg_fragment_size_in_pages as 'Avg Frag Size (pages)',
    IPS.page_count as 'Page Count', 
    IPS.forwarded_record_count as 'Forwarded Records',
    --IPS.avg_page_space_used_in_percent as 'Avg Page Space Used (%)', 
    --IPS.record_count as 'Record Count', 
    --IPS.ghost_record_count as 'Ghost Record Count',
    IPS.fragment_count as 'Fragment Count'
FROM sys.dm_db_index_physical_stats
    (
        db_id(@DB), 
        OBJECT_ID(@Table), 
        NULL,
        NULL , 
        'LIMITED'
    ) as IPS
JOIN sys.indexes as SI WITH (nolock) 
    ON IPS.object_id = SI.object_id 
    AND IPS.index_id = SI.index_id
ORDER BY 1,3,5

对于自动收缩,您只需检查master.sys.databases

select * from master.sys.databases
where is_auto_shrink_on = 1

+1,谢谢我的需要。但是,我的“唯一”是,我看到某些数据库根本没有返回任何结果,仅是因为它们需要在sys数据库中具有物理统计信息吗?
雅各布2012年

@Jakub-是的 该脚本还忽略堆(未索引表),因此,如果数据库中没有索引表,则也不会显示。
JNK 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.