SQL Server Sparse Columns

Bir sütunun verileri genellikle NULL değer alıyorsa, saklanan verinin daha az yer kaplaması için, sütunun Sparse özelliğinin ayarlanması gerekiyor. Böylece %20 ile %40 arasında yer tasarrufu sağlanmış olur.

SQL Server, Sparse özelliği atanmış bir sütunun verilerini saklarken, NULL olmayan değerler için normalden daha fazla yer kullanırken NULL değerler içinse disk alanı kullanmaz. Bu yüzden, sadece NULL değerlerin çokça olduğu sütunlar için Sparse özelliğinin ayarlanması gerekmektedir.

sparse

https://msdn.microsoft.com/en-us/library/cc280604.aspx adresinde, hangi veri tipinde ne kadar yer kazancı olduğu tablo şeklinde verilmiştir.

Etiketler:  SQL

Database Management / Index

Not : Özet bilgi içerir.

Veritabanı verilerin ilişkisel depolandığı alanlardır. Metin, tarih, sayısal değer, resim dosyası vb. farklı veri tipleri veritabanı üzerinde yer alabilir. Veritabanı Yönetim Sistemi (Database Management System DBMS) ise, veritabanlarının oluşturulması ve yönetilmesi için kullanılan sistemlerdir.

Klasik veritabanlarında veriler, B+ ağaçları (B+ tree) üzerinde saklanır. B+ ağaçları, verileri okumak için gerekli olan disk erişim sayısının en aza indirilmek için tercih edilir. B+ ağaçları:

  • Dengeli ağaçlardır. Ağaç üzerindeki tüm yaprak düğümler aynı seviyededir.
  • Her düğümde birden fazla değer saklanır.
  • Tüm değerler, ağacın yaprak düğümleri arasında mutlaka bulunur.

B+ ağacının yaprak düğümleri, bağlantılı liste (linked list) şeklindedir ve tüm değerler yaprak düğümler üzerinde sıralı bir şekilde saklanır.

Örnek bir B+ ağacı aşağıda verilmiştir. (Bu ağaç adresinde yer alan animasyon kullanılarak oluşturulmuştur.)

b plus tree

B+ ağacı üzerinde hangi değerlerin hangi sıra ile tutulacağını, tablolar üzerinde tanımlanmış olan index yapıları belirler.

Clustered Index

Tablo verisinin tutulduğu B+ ağacıdır. Dolayısıyla, bir tablo için sadece bir adet clustered index bulunabilir. Tüm tablo verisi, B+ ağacının yaprak (leaf) düğümleri üzerinde sıralı bir şekilde tutulur. Verilerin sırasını tablo üzerindeki Primery Key belirler.

Tablo üzerinde belirli bir ID değerine sahip satırın verileri getirilmek isteniyorsa, ilk olarak ağaç üzerinden bu ID değerine sahip yaprak düğüm bulunur. B+ ağacı yaprak düğümü üzerinde ise, tablonun o satırına ait verinin disk üzerinde hangi alanda bulundu bilgisi yer alır. Bu yüzden belirli bir ID değerine sahip satıra erişimek için (SELECT * FROM [TABLO_ADI] WHERE ID=5), { Ağaç üzerinden ID değerinin saklandığı yaprak düğümü bul => Yaprak düğüm içeriğini diskten oku => Satır verilerini diskten oku } yolu izlenir.

Nonclustered Index

Clustered index dışında, tablo üzerindeki veriye erişim için farklı indeksler tanımlanabilir. Tablo üzerinde seçilen bir ya da birkaç sütun üzerinden nonclustered index oluşturulabilir. Seçilen sütunların aldığı tüm değerler, yine B+ ağacı üzerinde tutulur. B+ aşağı disk üzerinde saklanır.

Ağacın yaprak düğümlerinde, düğümde yer alan değerlere karşılık gelen primary key değerleri ve bu değerlerin clustered index üzerinde nerede tutulduklarına ait işaretçiler yer alır. Örneğin, [OGRENCI] tablosunda, öğrencinin yer aldığı [SINIF] sütunu üzerinden bir nonclustered index oluşturulmak istediğinde, B+ aşağı üzerinde tüm sınıf değerleri yer alır. Bu ağacın yaprak düğümlerinde ise, yaprak düğümde yer alan sınıfa ait öğrencilerin ID değerleri ve bu ID değerlerinin ağacın clustered indeksi üzerinde nerede bulunduğu bilgisi (pointer, disk üzerindeki adresi) yer alır. Pointer ile, öğrencilerin diğer bilgilerine ihtiyaç duyulduğunda, her ID için clustered index üzerinden yeniden bir arama yapma ihtiyacı ortadan kalkar.

Modern veritabanı yönetim sistemleri, nonclustered indeks yaprak düğümlerinde, primary key dışında, tablo satırına ait farklı sütun değerlerinin de saklanmasına imkan verir. Bu durum disk üzerinde saklanan nonclustered index boyutunun büyünesine sebep olacaktır.

Her nonclustered indeks veritabanı boyutunu büyüteceği ve insert/update/delete maliyetlerini artıracağı için, index tanımlama konusunda dikkatli olmak gerekmektedir.

Heap

Primary Key değeri, dolayısıyla clustered indekse sahip olmayan tablo verilerini disk üzerinde saklamak için kullanılan bir yapıdır. Özellikle satır sayısı çok az olan tablolar dışında tercih edilmemelidir.

Etiketler:  SQL

SQL ROW_NUMBER

SQL sorgu sonucunda, satırlara numara vermek için kullanılır. kendime not

En yüksek değere sahip etiketin sıra numarası 1 olacak şekilde, tüm satırlar DEGER sütununa göre sıralanıyor.

SELECT AD, DEGER, SIRA = ROW_NUMBER() OVER (ORDER BY DEGER DESC)
FROM ETIKET

PARTITION BY ile, sorgu sonucu etiket kategorisine göre gruplandıktan sonra, her bir grupta yer alan etiketlere kendi içerisinde sıra numarası veriliyor. Gruplarda, en küçük değere sahip etiketlerin sıra numarası 1'dir.

SELECT AD, DEGER, SIRA = ROW_NUMBER() OVER (PARTITION BY KATEGORI_ID ORDER BY DEGER)
FROM ETIKET
Etiketler:  SQL

Kategoriler

Algoritma (5), Cheat Sheet (2), Framework (3), İpucu (5), Kendime Not (1), Kitap (4), Kod (5), Matematik (1), Proje (5), Veritabanı (3), Workshop (3)

Etiketler

C# (13) HTML (1) JavaScript (2) SQL (3)

İngilizce / Türkçe

İngilizce / Türkçe kelime listesi kendime not