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

Jak*_*kub 8 sql-server-2005 sql-server

我要做的是查看我们的数据库并锁定所有auto-shrink设置,以及处理哪些数据库/表高度碎片化。

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

我知道我可以在每个表级别(至少 SQL Server 2005)运行以下内容:

DBCC SHOWCONTIG ('DB.TABLE');
Run Code Online (Sandbox Code Playgroud)

但是我可以运行什么来显示数据库中的所有表?

谢谢

JNK*_*JNK 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
Run Code Online (Sandbox Code Playgroud)

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

select * from master.sys.databases
where is_auto_shrink_on = 1
Run Code Online (Sandbox Code Playgroud)