24 Eylül 2008 Çarşamba

SQL Server daki tablolalarım disk üzerinde ne kadar yer kaplıyor


Bugün, database'imizde bulunan tüm tabloların datalarının ve indexlerinin ne kadar yer tuttuğunu gösteren bir stored procedure yazacağız. Aşağıdaki kod ile sistemdeki tüm tabloların bilgilerini görebiliriz.





SELECT * FROM sys.tables




sp_MStablespace @TableName sistem prosedürü SQL Server 2000'de de vardı. SQL Server 2005'de de çalışıyor. Çalıştırıldığında tek satırlık 3 kolonluk bir resultset dönüyor.

  • Rows: Tabloda kaç satır var

  • DataSpaceUsed : Tablodaki veriler ne kadar yer kaplıyor

  • IndexSpaceUsed :Tablonun index leri ne kadar yer kaplıyor

Bize örnek oluşturması için bir test tablosu yaratalım içine biraz data ekleyelim.




CREATE TABLE Test(ID int identity(1,1),TextVal varchar(200))
GO
DECLARE @i int

SET @i=1

WHILE @i<=100 BEGIN
-- Rastgele birşeyle oluşturalım
INSERT INTO Test(TextVal)
SELECT Replicate('ab',@i)
SET @i = @i+ 1
END


SELECT * FROM Test




IDTextVal
1ab
2abab
3ababab
4abababab
5ababababab
6abababababab
7ababababababab
8abababababababab
9ababababababababab
.......


100. satırda, 100 kere 'ab' içeren bir datamız olacak.

Yarattığımız tabla ne kadar yer kaplıyormuş bakalım:

exec sp_MStablespace 'Test'



RowsDataSpaceUsedIndexSpaceUsed
100168


Bütün tabloların boyutlarını öğrenmek istersek sys.tables view sistem view ini kullanarak tüm tabolar için bunu çalıştırabiliriz





CREATE TABLE #TableSize(TableName nvarchar(255),Rows int,DataSpace int, IndexSpace int)

DECLARE @Table nvarchar(255)


DECLARE oCur CURSOR READ_ONLY FAST_FORWARD FOR

SELECT name

FROM sys.tables

ORDER BY name


OPEN oCur

WHILE (1=1) BEGIN

FETCH NEXT FROM oCur INTO @Table

IF @@FETCH_STATUS <> 0 BREAK


INSERT INTO #TableSize(Rows,DataSpace,IndexSpace)

EXEC SP_MSTABLESPACE @table


-- Hangi tablo olduğu bilgisi proc. den dönmüyor. Null olarak yazdık. Şimdi güncelleyelim

UPDATE #TableSize SET TableName = @Table WHERE TableName is null

END

CLOSE oCur

DEALLOCATE oCur

SELECT * FROM #TableSize



Şimdi bunu başka bir yöntem ile yapalım.
Tablonun boyutunu öğrenmek için kullanılabilecek bir sistem prosedürü daha var : sp_spaceused @TableName
Bu procedure biraz daha farklı bir sonuç döndürüyor ancak dönen resultset içerisinde tablo nun ismi de var.

exec sp_spaceused 'Test' sonucu:

namerowsreserveddataindex_sizeunused
Test10024 KB16 KB8 KB0 KB


Buradan dönen değerleri yine bir tabloya yazalım ama bu sefer cursor yerine farklı bir yöntem kullanalım.




Daha çok tüm tabloların indexlerini yeniden yaratmak için kullandığım bir sistem prosedürü var.

EXEC sp_MSforeachtable @command1='Command String'


@command1 e verilen sql ifadesini çalıştırır. Tablo parametresi geçmek için command içerisinde tablo adı yerine ? geçilir






CREATE TABLE #TableSize
(
[name] nvarchar(255),
[rows] int,
[reserved] varchar(20),
[data] varchar(20),
[index_size] varchar(20),
[unused] varchar(20)
)
-- Mevcut database deki tüm tablolar için sp_spaceused proc. ü çağırılıp, dönen recordset #TableSize tablosu eklenir
EXEC sp_MSforeachtable @command1=
"INSERT INTO #TableSize
EXEC sp_spaceused '?'"

SELECT * FROM #TableSize


1 yorum:

raiden dedi ki...

çok güzel olmuş. ellerine sağlık bilgi için