2010-01-19 12 views
84

SQL Server veritabanındaki en büyük nesneleri bulmaya nasıl giderim? Öncelikle, hangi tabloların (ve ilgili indekslerin) en büyük olduğunu belirleyerek ve belirli bir tabloda hangi satırların en büyük olduğunu belirledikten sonra (BLOB'larda ikili veriyi saklıyoruz)?SQL Server veritabanında en büyük nesneleri nasıl bulunur?

Bu tür veritabanı çözümlemelerinde yardımcı olacak herhangi bir araç var mı? Ya da sistem tablolarına karşı çalıştırdığım bazı basit sorgular var mı?

cevap

203

Bu SQL komut dosyasını (birisinden aldım, bir yerden aldım - nereden geldiğini yeniden yapılandıramıyor) yaşıyorum ve bu bana biraz anlayış ve dizin ve tabloların boyutunu belirleme konusunda yardımcı oldu:

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) 

Elbette, başka bir sıralama ölçütü kullanabilirsiniz.

ORDER BY SUM(p.rows) DESC 

en satırlarla tabloları almak için, ya da

ORDER BY SUM(a.total_pages) DESC 

kullanılan en sayfa (8K blok) ile tabloları almak için.

+0

Mükemmel, teşekkürler! Şimdi, en büyük nesneyi, ikili veri satırlarından hangisinin en büyük olduğunu bulmak için çok fazla ikili veri içeren bir tabloya daralttım mı? Bunun için – jamesaharvey

+3

, bu tablo üzerinde bir seçim yapmak ve ilgilendiğiniz her alan için DATALENGTH (alan) yazdırmak gerekir (genellikle VARCHAR (MAX), VARBINARY (MAX) ve benzeri) –

+0

Mükemmel, teşekkürler tekrar! – jamesaharvey

2

Sql Server Management Studio 2008 kullanıyorsanız, nesne gezgini ayrıntıları penceresinde görüntüleyebileceğiniz belirli veri alanları vardır. Sadece tablo klasörüne göz atın ve seçin. Ayrıntılar görünümünde sütun başlıklarını sağ tıklayıp "rapor" alanına alan ekleyebilirsiniz. SSMS 2008 ekspresindeysanız, kilometreniz değişebilir.

3

Ayrıca aşağıdaki kodu kullanabilirsiniz: Ben SqlServerCentral çok yardımcı da bu sorguyu buldum

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

, burada orijinal yayına link

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 

Veritabanımda bu sorgu ile 1. cevap arasında farklı sonuçlar verdiler.

Umut birileri bağlantı vardır en büyük tablo bulmak için yararlı

+0

Bu harikaydı teşekkürler! – ADL

3

Bu sorgu yardım bulur.

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

Kolayca ezberleyebileceğimiz bir şeye sahip olmak güzel. Dürüstlük için teşekkürler. –

34

SQL Server 2008'de, standart rapor Disk Kullanımı'nı Üst Tablolara göre de çalıştırabilirsiniz. Bu tarafından DB'ye tıklanarak, Raporlar -> Standart Raporlar seçilerek ve istediğiniz raporu seçerek bulunabilir.

+4

Hiç şaka mı yok? Bu devrimci bir cevaptır. Gönderin için teşekkürler. (Alaycılık değil. Şu an bu sorguları bir süreliğine elle çalıştırıyordum ve bu raporların zaten orada olduğuna inanamıyorum!) –

İlgili konular