|
|
|
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 |
|