Cách hiệu quả nhất để lấy số liệu thống kê trên toàn bộ cơ sở dữ liệu SQL Server


8

Những gì tôi đang tìm kiếm là xem xét cơ sở dữ liệu của chúng tôi và khóa bất kỳ auto-shrinkcài đặt nào , cũng như kiểm soát xem cơ sở dữ liệu / bảng nào bị phân mảnh cao.

Có một kịch bản cụ thể nào tôi có thể chạy để có được một ý tưởng tốt cho mỗi cơ sở dữ liệu không?

Tôi biết tôi có thể chạy các mục sau theo cấp độ bảng (ít nhất là SQL Server 2005):

DBCC SHOWCONTIG ('DB.TABLE');

Nhưng những gì tôi có thể chạy để hiển thị cho tôi tất cả các bảng trong cơ sở dữ liệu?

Cảm ơn

Câu trả lời:


6

Để kiểm tra phân mảnh trong năm 2005/2008, bạn có thể sử dụng tập lệnh sau. Bạn cần đặt @DB@Tablecác giá trị. Nếu bạn xác định những cái NULLđó thì nó sẽ chạy trên tất cả các cơ sở dữ liệu và / hoặc tất cả các bảng. Nếu bạn thực hiện một db duy nhất, hãy đảm bảo bạn thực thi trong ngữ cảnh của 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

Để tự động thu nhỏ, bạn chỉ cần kiểm tra master.sys.databases:

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

+1, cảm ơn chỉ những gì tôi cần. Tuy nhiên, 'chỉ' của tôi là, tôi thấy một số cơ sở dữ liệu hoàn toàn không có kết quả, có phải chỉ vì chúng cần có các số liệu thống kê vật lý trong sysdb?
Jakub

@Jakub - vâng. Kịch bản lệnh này cũng bỏ qua các đống (các bảng không được lập trình), vì vậy nếu không có bảng được lập chỉ mục nào trong DB thì nó cũng sẽ không hiển thị.
JNK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.