23
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 :
-
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
şeklinde tabloları oluşturup verileri ekledikten sonra iki tablo arasındaki farkı
-
exec sp_spaceused SparseOlmayanTablo
-
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
-
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
-
-
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
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:
-
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, tablolara 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 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



