3 Ekim 2008 Cuma

SQL Server 2008: Sparse Columns

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

Hiç yorum yok: