MSSQL Server Veritabanı  Altındaki En Büyük Tabloları Bulma Komutu

Aşağıdaki kod bloğuyla veritabanı altında bulunan tabloların toplam boyutunu görebiliriz.

 USE DB_NAME
SELECT 
    t.name AS TableName,
    s.name AS SchemaName,
    p.rows,
    CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
    CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB,   
    CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
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
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    t.name NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.object_id > 255 
GROUP BY 
    t.name, s.name, p.rows
ORDER BY 
    TotalSpaceMB DESC, t.name

UnusedSpaceMB tablonun büyümesi için ayrılmış ancak kullanılmayan alan olarak karşımıza çıkmaktadır. UsedspaceMB tablonun gerçek veriler için kullandığı alan. TotalspaceMB tablonun kapladığı toplam disk alanı.

Aşağıdaki komut ile tüm instance altında bulunan veritabanların Row sayısı en fazla olan 15 tabloyu döndürmektedir. TotalSpaceMB kolonuna görede sıralama işlemi yapılabilir.

EXEC sp_MSforeachdb '
USE [?];
IF ''?'' NOT IN (''master'', ''model'', ''msdb'', ''tempdb'')
BEGIN
    SELECT TOP 15
        ''?'' AS DatabaseName,
        t.name AS TableName,
        s.name AS SchemaName,
        p.rows,
        CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
        CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB,   
        CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
    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
    LEFT OUTER JOIN 
        sys.schemas s ON t.schema_id = s.schema_id
    WHERE 
        t.name NOT LIKE ''dt%'' 
        AND t.is_ms_shipped = 0
        AND i.object_id > 255 
    GROUP BY 
        t.name, s.name, p.rows
    ORDER BY 
        p.rows DESC, t.name
		END
		'

Bu scprit dışında ssms arayüz kısmında ilgili veritabanına sağ tıklayıp Report seçeneğinden Disk Usage by Top Tables ile aynı sonuçları görebiliriz.

Gerekli seçimi yaptıktan sonra veritabanı altındaki tabloları görebiliriz.

Başka bir makalede görüşmek dileğiyle.


O, ölüden diriyi çıkarır, diriden ölüyü çıkarır ve kışta ölümünün ardından baharda yeryüzünü tekrar diriltir. İşte siz de öldükten sonra böyle diriltilip, kabirlerinizden çıkarılacaksınız.” Rûm-19

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir