2010-01-19 18 views
84

Co zrobić, aby znaleźć największe obiekty w bazie danych SQL Server? Po pierwsze, określając, które tabele (i powiązane indeksy) są największe, a następnie określając, które wiersze w danej tabeli są największe (przechowujemy dane binarne w obiektach BLOB)?Jak znaleźć największe obiekty w bazie danych SQL Server?

Czy są jakieś narzędzia do pomocy przy tego typu analizie bazy danych? A może są jakieś proste zapytania, które mógłbym uruchomić przeciwko tabelom systemowym?

Odpowiedz

203

Używam tego skryptu SQL (który dostałem od kogoś, gdzieś - nie mogę odtworzyć tego, z którego pochodzi) od dawna i pomogło mi to w zrozumieniu i określeniu rozmiaru indeksów i tabel:

SELECT 
    t.NAME AS TableName, 
    i.name as indexName, 
    sum(p.rows) as RowCounts, 
    sum(a.total_pages) as TotalPages, 
    sum(a.used_pages) as UsedPages, 
    sum(a.data_pages) as DataPages, 
    (sum(a.total_pages) * 8)/1024 as TotalSpaceMB, 
    (sum(a.used_pages) * 8)/1024 as UsedSpaceMB, 
    (sum(a.data_pages) * 8)/1024 as DataSpaceMB 
FROM 
    sys.tables t 
INNER JOIN  
    sys.indexes i ON t.OBJECT_ID = i.object_id 
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id 
WHERE 
    t.NAME NOT LIKE 'dt%' AND 
    i.OBJECT_ID > 255 AND 
    i.index_id <= 1 
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name 
ORDER BY 
    object_name(i.object_id) 

Oczywiście można użyć innych kryteriów zamówienia, np.

ORDER BY SUM(p.rows) DESC 

dostać tabele z największą liczbą wierszy lub

ORDER BY SUM(a.total_pages) DESC 

uzyskać tablic z większości stron (8K bloki) używanych.

+0

Doskonale, dziękuję! Teraz, że zawęziłem mój największy obiekt do tabeli zawierającej wiele danych binarnych, w każdym razie, aby dowiedzieć się, który z wierszy danych binarnych jest największy? – jamesaharvey

+3

w tym celu, musisz wybrać opcję na tym stole i wydrukować DATALENGTH (pole) dla każdego pola, które Cię interesuje (zazwyczaj VARCHAR (MAX), VARBINARY (MAX) i tak dalej) –

+0

Doskonale, dzięki jeszcze raz! – jamesaharvey

2

Jeśli używasz Sql Server Management Studio 2008 istnieją pewne pola danych, które można wyświetlić w oknie szczegółów eksploratora obiektów. Wystarczy przejrzeć i wybrać folder tabel. W widoku szczegółów możesz kliknąć prawym przyciskiem myszy tytuły kolumn i dodać pola do "raportu". Twój przebieg może się różnić, jeśli korzystasz z Expressu SSMS 2008.

3

Możesz także użyć następującego kodu:

USE AdventureWork 
GO 
CREATE TABLE #GetLargest 
(
    table_name sysname , 
    row_count  INT, 
    reserved_size VARCHAR(50), 
    data_size  VARCHAR(50), 
    index_size VARCHAR(50), 
    unused_size VARCHAR(50) 
) 

SET NOCOUNT ON 

INSERT #GetLargest 

EXEC sp_msforeachtable 'sp_spaceused ''?''' 

SELECT 
    a.table_name, 
    a.row_count, 
    COUNT(*) AS col_count, 
    a.data_size 
    FROM #GetLargest a 
    INNER JOIN information_schema.columns b 
    ON a.table_name collate database_default 
    = b.table_name collate database_default 
     GROUP BY a.table_name, a.row_count, a.data_size 
     ORDER BY CAST(REPLACE(a.data_size, ' KB', '') AS integer) DESC 

DROP TABLE #GetLargest 
2

Znalazłem ten zapytanie również bardzo pomocny w SqlServerCentral, tu jest link do oryginalnego wpisu

Sql Server largest tables

select name=object_schema_name(object_id) + '.' + object_name(object_id) 
, rows=sum(case when index_id < 2 then row_count else 0 end) 
, reserved_kb=8*sum(reserved_page_count) 
, data_kb=8*sum(case 
    when index_id<2 then in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count 
    else lob_used_page_count + row_overflow_used_page_count 
    end) 
, index_kb=8*(sum(used_page_count) 
    - sum(case 
      when index_id<2 then in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count 
     else lob_used_page_count + row_overflow_used_page_count 
     end) 
    )  
, unused_kb=8*sum(reserved_page_count-used_page_count) 
from sys.dm_db_partition_stats 
where object_id > 1024 
group by object_id 
order by 
rows desc 

W mojej bazie danych dali różne wyniki między tym zapytaniem a pierwszą odpowiedzią.

nadzieję, że ktoś znajdzie użyteczną pomoc

+0

To było wspaniałe dzięki! – ADL

3

tego zapytania, aby znaleźć największy stolik jesteś połączenia.

SELECT TOP 1 OBJECT_NAME(OBJECT_ID) TableName, st.row_count 
FROM sys.dm_db_partition_stats st 
WHERE index_id < 2 
ORDER BY st.row_count DESC 
+0

Dobrze jest mieć coś, co możemy łatwo zapamiętać. Dzięki za zwięzłość. –

34

W SQL Server 2008 można również po prostu uruchomić standardowy raport Wykorzystanie dysku według najlepszych tabel. Można go znaleźć pod klikając prawym przyciskiem myszy DB, wybierając Raporty-> Raporty standardowe i wybierając odpowiedni raport.

+4

Bez żartów? Taka jest rewolucyjna odpowiedź. Dziękujemy za przesłanie wiadomości. (Nie sarkazm. Od dawna uruchamiam te zapytania ręcznie i nie mogę uwierzyć, że te raporty już istnieją!) –

Powiązane problemy