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