SQL Serverデータベース全体の統計を取得する最も効率的な方法


8

私がやろうとしていることは、データベースを確認してすべてのauto-shrink設定をロックし、どのデータベース/テーブルが非常に断片化されているかを把握することです。

データベースごとに良いアイデアを得るために実行できる特定のスクリプトはありますか?

テーブルレベル(少なくともSQL Server 2005)で以下を実行できることはわかっています。

DBCC SHOWCONTIG ('DB.TABLE');

しかし、データベース内のすべてのテーブルを表示するために何を実行できますか?

ありがとう

回答:


6

2005/2008の断片化をチェックするには、次のスクリプトを使用できます。@DB@Table値を設定する必要があります。これらを定義するとNULL、すべてのデータベースまたはすべてのテーブル、あるいはその両方で実行されます。単一のdbを実行する場合は、必ずそのDBのコンテキスト(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ですか?
Jakub 2012年

@Jakub-うん。このスクリプトはヒープ(インデックス付けされていないテーブル)も無視するため、DBにインデックス付けされたテーブルがない場合も表示されません。
JNK 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.