Самый эффективный способ получить статистику по всей базе данных SQL Server

8

Что я хочу сделать, так это просмотреть наши базы данных и заблокировать любые auto-shrinkнастройки, а также получить представление о том, какие базы данных / таблицы сильно фрагментированы.

Есть ли конкретный скрипт, который я могу запустить, чтобы получить хорошую идею для каждой базы данных?

Я знаю, что могу запустить следующее на уровне таблицы (по крайней мере, SQL Server 2005):

DBCC SHOWCONTIG ('DB.TABLE');

Но что я могу запустить, чтобы показать мне все таблицы в базе данных?

Спасибо

Якуб
источник

Ответы:

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
JNK
источник
+1, спасибо только что мне нужно. Мое «единственное», однако, я вижу, что некоторые базы данных вообще не дают результата, только потому, что им нужна физическая статистика в sysБД?
Якуб
@ Якуб - да. Этот сценарий также игнорирует кучи (неиндексированные таблицы), поэтому, если в БД нет проиндексированных таблиц, он также не будет отображаться.
JNK