MSSQL Server Tablo ve Index Büyüklüklerini Bulma

Bu makalede mssql server veritabanlarında bulunan tablomuzun index boyutunu öğrenmiş olacağız. İndex boyutunu öğreneceğimiz ilk bölüm SSMS arayüzünden görebiliriz. Veritabanımız üzerine sağ tıklayıp Report bölümünden Disk Usage by Table dersek ilgili tablolarda bulunan indexs’lerin toplam boyutunu görebiliriz.

Gelen ekranda Indexes bölümünden index boyutlarını görebiliriz.

Genellikle hangi tablolarımız üzerinde işlemler yapılacaksa ilgili bölümden tabloların ne kadar büyüklükte olduğunu rahatlıkla görebiliriz.

1-Aşağıdaki komut ile veritabanı altında bulunan tablo ve indexs’lerin toplam boyutlarını geçici bir tabloya atabiliriz.

;with cte as (
SELECT
t.name as TableName,
SUM (s.used_page_count) as used_pages_count,
SUM (CASE
            WHEN (i.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) as pages
FROM sys.dm_db_partition_stats  AS s 
JOIN sys.tables AS t ON s.object_id = t.object_id
JOIN sys.indexes AS i ON i.[object_id] = t.[object_id] AND s.index_id = i.index_id
GROUP BY t.name
)
select
    cte.TableName, 
    cast((cte.pages * 8.)/1024 as decimal(10,3)) as TableSizeInMB, 
    cast(((CASE WHEN cte.used_pages_count > cte.pages 
                THEN cte.used_pages_count - cte.pages
                ELSE 0 
          END) * 8./1024) as decimal(10,3)) as IndexSizeInMB
from cte
order by 2 desc

2-Aşağıdaki komut ise veritabanı altındaki tüm tabloları sp_spaceused komutunu çalıştırarak tüm tablo bazlı gelen değerleri temp tabloya atmaktadır.

create table #tablolistesi
(
  TabloIsmi nvarchar(250),
  satirsayisi varchar(50),
  reserveedilmisalan varchar(50),
  veri varchar(50),
  indexbuyuklugu varchar(50),
  kullanılmayanalan varchar(50)
)
declare @TabloIsmi nvarchar(250)
declare crs cursor for
SELECT SCHEMA_NAME(schema_id) +'.'+  name As TableTabloIsmi from sys.tables
ORDER BY name
open crs
fetch crs into @TabloIsmi
while @@fetch_status = 0 begin
  insert into #tablolistesi
  exec sp_spaceused @TabloIsmi
  fetch crs into @TabloIsmi
end
close crs
deallocate crs

select * from #tablolistesi
order by convert(int, substring(reserveedilmisalan, 1, len(reserveedilmisalan)-3)) desc

drop table #tablolistesi

Belirtilen link sayesinde sp_spaceused stored procedure kavramını detaylı bir şekilde öğrenebilirsiniz. İlgili Link

Index boyutuna bakılacak tablonun properties ekranından bulunan Storage bölümüne  tıkladığımızda index boyutunu görebiliriz.

3-) Veritabanı altında bulunan tüm indexslerin boyutlarını gösteren başka bir komutu görmekteyiz.

SELECT 
    i.name AS IndexName,
    SUM(ps.reserved_page_count) * 8/1024.0/1024.0 AS IndexSizeMB  -- Sayfa sayısını 8 KB ile çeviriyoruz
FROM sys.dm_db_partition_stats ps
JOIN sys.indexes i ON ps.object_id = i.object_id AND ps.index_id = i.index_id
GROUP BY i.name
order by IndexSizeMB desc;

Aşağıdaki komut ile instance altında bulunan veritabanlarındaki en büyük 5 tabloyu göstermektedir. Komutu veritabanı bazlıda çalıştırılabilir.


exec sp_msforeachdb'
use[?];
SELECT TOP 1
 DB_NAME() as DatabaseName,
    t.name AS TableName,
    s.name AS SchemaName,
    SUM(a.total_pages) * 8 /1024/ 1024.0 AS SizeGB,
    SUM(p.rows) AS [RowCount]
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
INNER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    i.index_id <= 1  -- sadece heap veya clustered index
--and t.name like''%log%''
GROUP BY 
    t.name, s.name
ORDER BY 
    SizeGB DESC;'
	

Bu makalede mssql server yapımızda tablo ve index büyüklüklerini bulma  konusuna değinmiş olduk. Başka bir makalede görüşmek dileğiyle..

“Lokmân, “Sevgili oğlum” (dedi), “Yaptığın iş bir hardal tanesi ağırlığında bile olsa, bir kayanın içinde saklansa veya göklerde yahut yerin dibinde bulunsa yine de Allah onu açığa çıkarır. Kuşkusuz Allah her şeyi bütün gizlilikleriyle bilir, O her şeyden haberdardır.”Lokman-16

Author: Yunus YÜCEL

Bir yanıt yazın

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