Hoþgeldiniz           
   
"SQL Server baþvuru kaynaðýnýz"
Skip Navigation Links
=========
Anasayfa
Makaleler
Hatalar \ Çözümler
Duyurular
Diðer
Ýpuçlarý
Yararlý Adresler
Mesaj TahtasýExpand Mesaj Tahtasý
HakkýmdaExpand Hakkýmda
Ýletiþim
Kullanýcý Adý:
Þifre:
 

Ne Mutlu Türküm Diyene!

SQL Server ile ilgili soru sormak için buraya týklayýn!


Yazýlarýmý nasýl buluyorunuz?






En Son SQL Server ile Ýlgili Okuduðum Kitaplar
- Inside Microsoft SQL Server 2005: Query Tuning and Optimization - MS Press (Ýngilizce)
- Accelerated SQL Server 2008 - Apress (Ýngilizce)
- Designing and Optimizing Data Access by Using SQL Server 2005 - MS Press (Ýngilizce)
- Microsoft SQL Server 2005 Database Solutions Design - Wiley Publishing (Ýngilizce)- Optimizing and Maintaining a Database Administration Solution by Using SQL Server 2005 - MS Press (Ýngilizce)- Designing a Database Server Infrastructure Using SQL Server 2005 - MS Press (Ýngilizce)- SQL Server 2005 Implementation and Maintenance - MS Press (Ýngilizce)
- SQL Server 2005 Administrators Companion - MS Press (Ýngilizce)


                   
SQL Server 2008: Sparse Columns

Son güncelleme tarihi: 16 Eylül 2008
  


Merhaba,


Kýsaca, eðer bir alan içerisindeki (sütun) verilerin çoðunluðunu NULL deðeri oluþturuyorsa, o zaman bu alanda veri tasarrufu saðlamak için bu alanýn "Sparse" özelliðini etkinleþtirirsiniz. "Sparse" özelliði, bu alanda saklanacak olan NULL deðerleri için diskte daha az yer harcanmasýný saðlayacaktýr.

Tabi bunun da bir bedeli vardýr, NULL olmayan alanlardaki veriler için harcanacak yer fazlalaþacaktýr. Bu yüzden "Sparse" ý kullanmak için aklýnýzda bulundurmanýz gereken altýn kural, bu özelliði kullanacaðýnýz alandaki deðerlerin büyük çoðunluðunun NULL olmasý gerektiðidir. Bu deðerler hakkýnda fikir sahibi olmak için aþaðýdaki örnekleri inceleyebilirsiniz.

Her alan ve veritipinin de "Sparse" özelliði kullanýlamaz, buna aþaðýdaki örnekten sonra deðineceðim.


Nasýl Kullanýlýr?


Bir alaný "Sparse" olarak belirlemek için ise CREATE TABLE veya ALTER TABLE komutlarýný kullanmalýsýnýz. Bu komutlarýn SQL Server 2008 versiyonlarý hakkýnda daha fazla bilgi için
buraya týklayýn.

Misal olarak aþaðýdaki örneði uygulayýn:

CREATE TABLE SparseOlmayanTablo(a int, b int, c int, d int)
GO

CREATE TABLE SparseOlanTablo(a int, b int SPARSE, c int SPARSE, d int SPARSE)
GO

DECLARE @i int=0
WHILE @i < 100000
BEGIN
INSERT INTO SparseOlanTablo VALUES (@i,null,null,null)
INSERT INTO SparseOlmayanTablo VALUES (@i,null,null,null)
SET @i+=1
END

Yukarýdaki iþlem tamamlandýktan sonra da, hangi tabloda ne kadar alan kullanýldýðýný belirlemek için aþaðýdaki satýrlarý çalýþtýrýn:

exec sp_spaceused SparseOlmayanTablo
exec sp_spaceused SparseOlanTablo

Bu iki komutu da çalýþtýrdýktan sonra, aþaðýdaki gibi bir sonuç görmeniz gerekiyor:



Resim 1


Gördüðünüz gibi, iki tablo ayný alanlarý içerse de, "Sparse" özelliðini kullandýðýmýz tablo diðer tabloya nazaran diskte %50 daha az yer kaplýyor.

"Sparse" özelliðinin veri depolanmasýný nasýl etkileyebileceðini daha ayrýntýlý bir þekilde anlatabilmek için bir de þu örneðe bakýn

Örnek: 2
Tablo isimlerinin sonunda "N" olan tablolara NULL deðerler koyacaðýz, diðerlerine ise sýrayla bir sayý kaydedilecek.

DROP TABLE SparseOlanTablo
GO

DROP TABLE SparseOlmayanTablo
GO

CREATE TABLE
SparseOlanTablo(a int SPARSE)
GO

CREATE TABLE SparseOlanTabloN(a int SPARSE)
GO

CREATE TABLE SparseOlmayanTablo(a int)
GO

CREATE TABLE SparseOlmayanTabloN(a int)
GO

Yine bir önceki örnekteki WHILE döngüsünü 3 kere kullanýn. Birinci seferde 1.000 kayýt girin. Ýkinci seferde 10.000 ve üçüncü seferde de 100.000 kayýt girin. (Not: Kendi yaptýðým örnekte, her yeni bir döngüye baþlamadan önce tablolarýn içini boþalttým.)

DECLARE @i int=0
WHILE @i < 1000
BEGIN
INSERT INTO SparseOlanTablo VALUES (@i)
INSERT INTO SparseOlanTabloN VALUES (null)
INSERT INTO SparseOlmayanTablo VALUES (@i)
INSERT INTO SparseOlmayanTabloN VALUES (null)
SET @i+=1
END

Bunlarýn sonucu ise aldýðým "data" alanýnýn (yani verilerin diskte ne kadar yer kapladýklarý) deðerleri þöyle:

Satýr Sayýsý SparseOlanTablo SparseOlanTabloN SparseOlmayanTablo SparseOlmayanTabloN
1.000 24KB 16KB 16KB 16KB
10.000 232KB 120KB 136KB 136KB
100.000 2288KB 1144KB 1352KB 1352KB


Gördüðünüz gibi, "Sparse" özelliðini kullandýðýmýzda eðer tabloda hiç NULL deðer yoksa, o zaman bu bize kârdan çok zarar verecektir. 100.000 kayýt girildiðinde "Sparse" özelliðini kullandýðýmýz SparseOlanTablo isimli tablonun diskte kapladýðý alan 2.288KB, fakat "Sparse" özelliði kapalý olan tablo olan SparseOlmayanTablo isimli tablonun diskte kapladýðý alan ise 1.352KB. Ýkisinde de ayný veriler var.

Þimdi baþka bir örnek daha yapacaðýz. Bu örnekte ise, SparseOlanTablo' daki verilerin %90' ý NULL olacak, %10' u ise sayýlardan ibaret olacak.

Örnek: 3
DROP TABLE SparseOlanTablo
GO

DROP TABLE SparseOlmayanTablo
GO

CREATE TABLE SparseOlanTablo(a int SPARSE)
GO

CREATE TABLE SparseOlmayanTablo(a int)
GO

DECLARE @i int=0
WHILE @i < 10000
BEGIN
INSERT INTO SparseOlanTablo VALUES (@i)
INSERT INTO SparseOlmayanTablo VALUES (@i)
SET @i+=1
END

Yukarýdaki döngüyle birlikte, tablolarýmýza on bin kayýtlýk sayý girmiþ olduk. Þimdi de doksan bin kayýtlýk NULL veri gireceðiz.

DECLARE @i int=0
WHILE @i < 90000
BEGIN
INSERT INTO SparseOlanTablo VALUES (null)
INSERT INTO SparseOlmayanTablo VALUES (null)
SET @i+=1
END


Satýr Sayýsý SparseOlanTablo SparseOlmayanTablo
10.000 (Sayý) 264KB 136KB
90.000 (NULL) + 10.000 (Sayý) 1264KB 1352KB
900.000 (NULL) + 100.000 (Sayý) 12576KB 13520KB


Bu örneklerde hep "int" veritipini kullandýk. Unutmayýn ki, "Sparse" özelliðinin kullanýmý deðiþik veritiplerinin kullanýmýnda deðiþik sonuçlar verecektir.


"Sparse" Özelliðine SQL Server Management Studio ile Ulaþmak

Bu özelliðe, SQL Server Instance' larýnýn yönetilmesi amacýyla kullanýlan SQL Server Management Studio (SSMS)' dan ulaþmak için aþaðýdaki adýmlarý izleyin:
- SSMS' i baþlatýn,
- Çalýþma yapacaðýnýz SQL Server Instance' ýna baðlanýn,
- Object Explorer' dan ilgili veritabanýnýzdaki tablonuzu bulun ve üzerinde farenin sað tuþua týklayarak "Design" seçeneðini seçin,
- "Sparse" özelliðini (bkz Resim 2) açýlan penceredeki Column Properties' de bulacaksýnýz.



Resim 2


"Sparse" Kullanýmýnýn Tespiti

Bir tablodaki bir alanýn "Sparse" özelliðinin kullanýlýp kullanýlmadýðýný anlamak için ise aþaðýdaki komutu kullanabilirsiniz:

SELECT COLUMNPROPERTY(object_id('dbo.SparseOlanTablo'),'b','IsSparse')

Eðer sonuç olarak "1" dönüyorsa, o zaman sorguladýðýnýz alanýn "Sparse" özelliði kullanýlýyordur.


"Sparse" Özelliðinin Kullaným Kýsýtlamalarý

Yukarýda deðineceðimi söylediðim gibi, "Sparse" özelliði her zaman ve her veritipi için kullanýlamaz. Meselâ þu veritipleri kullanýlan alanlarda "Sparse" özelliði kullnýlamaz: geography, geometry, image, ntext, text, timestamp, user-defined data type.

Bunlardan baþka, "Sparse" özelliði açýk olduðunda, bu alan için bir "Default" deðer tanýmlanamaz. Bu alan bir "Rule" e baðlanýlamaz. Bir "Computed Column" un, "Sparse" özelliði etkinleþtirilemez. "Sparse" özelliði açýk olan bir alan, bir "Clustered Index" veya bir "Unique Primary Key Index" in parçasý olamaz.

Bunlar gibi kýsýtlamalar ve "Sparse" ýn hangi SQL Server teknolojileri ile kullanýlabileceði hakkýnda daha fazla bilgi için
buraya yýklayýn.


Ekrem Önsoy

Anasayfa


 
Bu sitenin tüm haklarý, Ekrem Önsoy' a aittir.