NULL alanlar için sparse columns…

Posted by Zafer | Posted in SQL | Posted on 23-01-2009

SQl tablolarımızın bazı sütunlarında gereğinden fazla NULL degeri yer alıyorsa eğer , bu sütunlarda tululan NULL değerlerinin daha az yer kaplamasını sağlayabiliriz. Bunu sağlamak içinse sparse özelliğinden yararlanırız.

Sparse özelliğinin dikkatli kullanılması gerekmektedir. Eğer sparse olarak tanımladığımız sütundaki NULL değerler sütunda yer alan verilerden daha az sayıda ise bu durumda verilerimiz daha çok yer kaplayacaktır. Yani bu özelliği kullanmak isteğimizde sütundaki hücrelerin çoğu NULL değerlerden oluşmalıdır. Ayrıca sparse özelliği her veri tipi ilede kullanılamamaktadır.

yazgeliştir.com adresinde verilen karşılaştırmaya göre :

  1. CREATE TABLE SparseOlmayanTablo(a int, b int, c int, d int)
  2. GO
  3.  
  4. CREATE TABLE SparseOlanTablo(a int, b int SPARSE, c int SPARSE, d int SPARSE)
  5. GO
  6.  
  7. DECLARE @i int=0
  8. WHILE @i < 100000
  9. BEGIN
  10. INSERT INTO SparseOlanTablo VALUES (@i,NULL,NULL,NULL)
  11. INSERT INTO SparseOlmayanTablo VALUES (@i,NULL,NULL,NULL)
  12. SET @i+=1
  13. END

şeklinde tabloları oluşturup verileri ekledikten sonra iki tablo arasındaki farkı

  1. exec sp_spaceused SparseOlmayanTablo
  2. exec sp_spaceused SparseOlanTablo

sorgularını çalıştırarak görebiliriz. Bu sorgudan sonra karşımıza aşağıdaki ekran gelmektedir.

Bu şekildeki sparse kullanımından sonra yaklaşık %50 lik bir depolama farkı elde etmekteyiz.

Yine yazgeliştir.com sitesindeki verilen örnekte  sparse özelliğini gerektiği gibi kullanmayalım ve karşılaşacağımız sonuca bakalım :

Tablo isimlerinin sonunda “N” olan tablolara NULL değerler koyacağız, diğerlerine ise sırayla bir sayı kaydedilecek

  1. CREATE TABLE SparseOlanTablo(a int SPARSE)
  2. GO
  3.  
  4. CREATE TABLE SparseOlanTabloN(a int SPARSE)
  5. GO
  6.  
  7. CREATE TABLE SparseOlmayanTablo(a int)
  8. GO
  9.  
  10. CREATE TABLE SparseOlmayanTabloN(a int)
  11. GO
  12.  
  13. DECLARE @i int=0
  14. WHILE @i < 1000
  15. BEGIN
  16. INSERT INTO SparseOlanTablo VALUES (@i)
  17. INSERT INTO SparseOlanTabloN VALUES (NULL)
  18. INSERT INTO SparseOlmayanTablo VALUES (@i)
  19. INSERT INTO SparseOlmayanTabloN VALUES (NULL)
  20. SET @i+=1
  21. END

Bu kodları çalıştırdıktan sonra ise aşağıdaki sonuçları almaktayız.

Şimdi ise SparseOlanTablo’ daki verilerin %90′ ı NULL olacak, %10′ u ise sayılardan ibaret olacak şekilde verilen örneğe bakalım:

  1. CREATE TABLE SparseOlanTablo(a int SPARSE)
  2. GO
  3.  
  4. CREATE TABLE SparseOlmayanTablo(a int)
  5. GO
  6.  
  7. DECLARE @i int=0
  8. WHILE @i < 10000
  9. BEGIN
  10. INSERT INTO SparseOlanTablo VALUES (@i)
  11. INSERT INTO SparseOlmayanTablo VALUES (@i)
  12. SET @i+=1
  13. END

Yukarıdaki döngüyle birlikte, tablolara on bin kayıtlık sayı girmiş olduk. Şimdi de doksan bin kayıtlık NULL veri gireceğiz.

  1. DECLARE @i int=0
  2. WHILE @i < 90000
  3. BEGIN
  4. INSERT INTO SparseOlanTablo VALUES (NULL)
  5. INSERT INTO SparseOlmayanTablo VALUES (NULL)
  6. SET @i+=1
  7. END

Bu durumda ise aşağıdaki gibi bir sonuçla karşılaşırız.

Verilen örneklerde int veri tipi kullanılmaktadır ve her veri türü için bu değerler değişmektedir.

Kaynak : yazgelistir.com

Post a comment