Ana Sayfa
Forumlar
Hakkımızda
Yükleniyor. Lütfen bekleyin ...
Kategoriler
ASP.NET
ADO.NET
Visual Basic .NET
Visual C# .NET
Visual Studio ve Araçlar
Windows Server System
Office System
.NET Framework
SQL Server
XML Web Servisleri
Yazılım Güvenliği
Yazılım Mühendisliği
Mobil Teknolojileri
Dynamics
Smart Client
Expression Studio
Silverlight
Kod Parçaları
Açık Kaynak Kodlu Uygulamalar
İş Zekası
Windows Mobile Embedded
0
Çıkış Yap
Üyelik Bilgilerimi Güncelle
Seminerlerim
Favorilerim
Ajanım
Yazgeliştir
Yazar olmak ister misiniz?
Forumlar
Kitap Önerileri
Haberler
Yazarlar
İpuçları
Görüşleriniz
Hakkımızda
İstatistikler
En son kayıt olan üye:
mervelif
Şuanki online üyeler (
11
) :
Jerico
,
asmin8001
,
mso101
,
ersintarhan
,
anilugur
,
metegroup
,
umitakpinar
,
byavasoglu
,
mathsdas
,
takula
,
muzafferdiler
SQL Server Kategorisi
»
SQL Server 2008: Sparse Columns
SQL Server 2008: Sparse Columns
Print Versiyonu
Yazar:
Ekrem Önsoy
Tarih:30.09.2008
Puan:
2
(Oy Kullanan:
2
)
Okuma Sayısı:
183
Makaleyi İşaretle
Makale Özeti
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.
Makale
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
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
Makaleyi nasıl buldunuz?
Makaleyi nasıl buldunuz?
Çok Kötü
Çok Yararlı
Görüşleriniz : (opsiyonel)
v2.4
Geri Bildirim (Feedback)
Site içerisinde yazılan tüm makalelerin yazım ve yayınlama hakkı aksi belirtilmediği sürece sadece yazarlara aittir.
Yazgelistir.Com Ekibi - 2006 -
Yazgelistir.com