ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!
Merhaba,
Kısaca, eğer bir alan (sütun) içerisindeki 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
Linkleri görebilmek için Turkmmo Forumuna ÜYE olmanız gerekmektedir.
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:
Bu iki komutu da çalıştırdıktan sonra, aşağıdaki gibi bir sonuç görmeniz gerekiyor:
[TABLE="width: 710"]
[TR]
[TD]
Resim 1
[/TD]
[/TR]
[/TABLE]
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:
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
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.
[TABLE="width: 710"]
[TR]
[TD]
Resim 2
[/TD]
[/TR]
[/TABLE]
"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:
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.