AJAX

AJAX (Asynchronous JavaScript And XML)

AJAX ile web sayfası yüklendikten sonra, sunucu üzerine veri göndermek ve sunucudan veri almak mümkündür. Böylece, sayfa yenilenmeden, sayfanın belirli bir bölümünün, sunucu tarafından alınan verilerle yenilenebilir.

AJAX

Sunucu ile iletişimi sağlamak için XMLHttpRequest nesnesi kullanılır. Tüm modern tarayıcılar XMLHttpRequest nesnesini destekler.

XMLHttpRequest nesnesi metotları

open(method, url, async) isteği oluşturur. method GET ya da POST olabilir. url iletişimin kurulacağı adrestir. async ise, iletişimin senkron ya da asenkron bir şekilde yapılacağını belirler. Asenkron işlemde, sunucu cevabı beklenmeksizin sayfa çalışmaya devam eder.

send() oluşturulan istediği sunucuya gönderir. method GET olarak seçildiği zaman kullanılır.

send(str) oluşturulan istediği sunucuya gönderir. method POST olarak seçildiği zaman kullanılır.

XMLHttpRequest nesnesi özellikleri

readyState XMLHttpRequest nesnesinin mevcut durumunu gösterir. 4 değeri, sunucu ile iletişimin kurulduğunu ve cevabın hazır olduğunu gösterir.

onreadystatechange readyState özelliğinde bir değişim olduğu zaman çağrılır. Örneğin, sunucuya yapılan istediğin tamamlanması durumunda tetiklenir.

status sunucudan alınan cevabın durumunu gösterir. 200 OK, 404 Not Found, 500 Internal Server Error vb. Ayrıca statusText özelliği de mevcuttur.

responseText sunucudan alınan cevaptır. Eğer sunucudan XML sonuç alınıyorsa, responseXML özelliği de kullanılabilir.

Örnek AJAX Kullanımı

<script type='text/javascript'>

    var request = new XMLHttpRequest();

    request.onreadystatechange = function () {
        // Sunucu cevabı hazır ve sunucudan bir hata alınmadıysa (200: OK)
        if (this.readyState == 4 && this.status == 200) {
            // Sunucudan dönen cevap
            var txt = this.responseText;
        }
    };

    // İstek oluşturuluyor.
    request.open("GET", "demo.aspx", true);

    // İstek gönderiliyor.
    request.send();

</script>

JQuery ile AJAX Kullanımı

JQuery kütüphanesi ile, tüm tarayıcılar ile uyumlu ve daha basit bir şekilde AJAX kullanımı mümkündür.

$.ajax() AJAX istediği oluşturur.

Örneğin, ASP.NET demo.aspx sayfası arkasında yer alan aşağıdaki metodun sonucunu sayfada göstermek istediğimiz zaman:

// JavaScript tarafından bu metoda erişebilmek için eklenmesi ve metodun statik olarak tanımlanması gerekiyor.
[WebMethod]
public static string Method1(string name, int number)
{
    return name + number;
}

JQuery ile yazılmış ilgili AJAX isteği:

<script type='text/javascript'>

    $.ajax({
        type: "POST", // GET ya da POST olabilir
        url: "demo.aspx/Method1", // Url
        data: '{"name":"selami","number":"3"}', // Sunucuya gönderilen veri
        contentType: "application/json",
        success: function (msg) {
            alert(msg.d);
        },
        error: function (err) { alert(err.responseText); }
    });

</script>

Data fazla detay için http://api.jquery.com/jquery.ajax/

Etiketler:  JavaScript

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

JQuery Cheat Sheet

JQuery, açık kaynak kodlu ve oldukça popüler JavaScript kütüphanelerinden birisidir. JQuery ile daha az zahmetle, anlaşılır, daha az hataya sahip ve tarayıcıdan bağımsız JavaScript kodları yazmak mümkündür.

JQuery

En sık kullandığım JQuery ifadeleri aşağıda listelendi.

Örnek HTML içerik. Bu içerik üzerinde aşağıdaki JQuery metotları uygulanacak.

 <div id="container">
    <a href="#" class="link">Link 1</a>
    <a href="#" class="link">Link 2</a>
    <input type="text" />
</div>

JQuery metotları

Sayfaya JQuery kütüphanesi eklemek için (CDN üzerinden)

<script src="https://code.jquery.com/jquery-latest.min.js"></script>
$(document).ready(function () { // Sayfa yüklenmesi bittikten sonra çalışacak JavaScript kodu });

$("#container"); // id değeri 'container' olan elaman seçiliyor.
$(".link"); // class değeri 'link' olan elamanlar seçiliyor.
$("input"); // Tüm input elamanları seçiliyor.
$("input[type='text']"); // Attribute kullanılarak elamanlar seçiliyor.
$("#container, .link, input"); // Birden fazla elaman aynı anda seçiliyor.
$("div > .link"); // Parent -> child ilişkisi (örnekte, div içerisinde .link sınıfına sahip tüm elemanlar seçiliyor)
$("div .link"); // Parent -> child ilişkisi (sadece bir alt seviye değil, tüm seviyelerdeki elemanlar seçiliyor)
$(".link").hide(); // Elemanları gizle
$(".link").show(); // Gizlenmiş elemanları görünür yap
$(".link").text(); // Eleman metnini al
$(".link").text("Link new text"); // Eleman metnini al
$("#container").html(); // Eleman HTML içeriğini al
$("#container").html("<a href='#'>new HTML content</a>"); // Eleman HTML içeriğini değiştir.
$("input").val(); // Eleman değeri alınıyor. (bu örnekte input metni)
$("input").val("newValue"); // Eleman değeri değiştiriliyor.
$(".link").attr("href"); // Elemanın özelliğini al (href özelliği alınıyor)
$(".link").attr("href", "http://www..."); // Elemanın bir özelliğini değiştir. Yoksa özelliği ekler.
$(".link").removeAttr("href"); // Elemanın özelliğini siliniyor.
$(".link").addClass("className"); // CSS sınıfı ekler
$(".link").removeClass("className"); // CSS sınıfını kaldırır
$(".link").hasClass("className"); // Eleman belirtilen CSS sınıfına sahip mi?
$("#container").css("propertyName"); // CSS style özelliğini geri döndürür. (örneğin, color)
$("#container").css("propertyName", "value"); // CSS style özelliği değiştiriliyor.
$("#container").width(); // Elemanın genişliği
$("#container").height(); // Elemanın yüksekliği,
$("#container").empty(); // Elemanın tüm içeriğini temizler
$(".link").remove(); // Elemanı siler
$(".link").wrap("<div class='new'></div>"); // Seçilen elemanların her birini, parametre olarak verilen elemanın içine koyar. (örnekte, .link sınıfına sahip her bir elemanı div içerisine alıyor.)
$(".link").wrapAll("<div class='new'></div>"); // Seçilen elemanların tümünü, parametre olarak verilen elemanın içine koyar. (örnekte, .link sınıfına sahip tüm elemanları div içerisine alıyor.)
$(".link").unwrap(); // Seçilen elemanların parent elemanını siler. (örnekte, .link sınıfının yer aldığı div siliniyor.)
$("#container").append("<div class='new'></div>"); // Seçilen elemanların içerisine yeni bir eleman ekler.
$("#container").after("<div class='new'></div>"); // Seçilen elemanın peşine yeni bir eleman ekler.
$("#container").before("<div class='new'></div>"); // Seçilen elemanın öncesine yeni bir eleman ekler.
$(".link").parent(); // Seçilen elemanın içerisinde bulunduğu elaman alınıyor. (örnekte, .link sınıfına ait elamanların yer aldığı div)
$("#container").children(); // Seçilen elemanın tüm alt elemanları alınıyor. Sadece birinci seviyedeki elemanlar alınır.
$("#container").next(); // Sonraki eleman alınır.
$("#container").prev(); // Önceki eleman alınır.
$("#container").find("a"); // Seçilen elemanın, verilen kritere alt elemanları alınıyor. Tüm seviyedeki elemanlar alınır. (örnekte, div içerisindeki tüm a elamanları alınıyor)
$(".link").first(); // Seçilen elemanların ilki alınıyor.
$(".link").eq(1); // .link sınıfına ait ikinci eleman seçiliyor. (zero based index)
$(".link").slice(1, 2); // Seçilen elemanlardan sadece verilen aralıktakiler alınıyor. (örnekte, 2. ve 3. eleman alınıyor. üst sınır verilmezse, 2. elemandan itibaren tüm elemanlar alınır.)
$(".link").add("#container"); // Seçilen elemanlara yeni elemanlar ekler.
$(".link").filter(function () { return $(this).css("display") == "none"; }); // Filtre şartına uyan elemanlar seçiliyor. (örnek, .link sınıfına sahip ve gizlenmemiş tüm elemanlar seçiliyor)
$(".link").each(function (index) { return $(this).hide(); }); // Seçilen elemanların her biri için, verilen fonksiyondaki işlemi uygular.
$(".link").click(function () { alert(1); }); // Seçilen elemana tıklanıyor
$(".link").mouseover(function () { $(this).text("mouse over"); }); // Fare ile elemanın üzerine gelindi
$(".link").mouseout(function () { $(this).text("mouse out"); }); // Fare elemanın üzerinden ayrıldı
$(".link").first().focus(); // Seçilen elemana odaklan
$(window).resize(function () { alert(1); }); // Ekran büyültüldü ya da küçültüldü
Etiketler:  JavaScript

LINQ Cheat Sheet

LINQ kod içerisinde SQL tarzı sorgular yapabilmemize olanak sağlayan bir teknolojidir.

lambda

Urun nesnelerinin ve tamsayı değerlerinin yer aldığı iki farklı dizi üzerinde sorgulama işlemleri gerçekleştirilecektir.

        public class Urun
        {
            public int Numara { get; set; }
            public string Ad { get; set; }
            public string Kategori { get; set; }
            public double Deger { get; set; }
        }

        var dizi = new[] { 2, 3, 7, 4, 5, 4, 9, 1, 3 };
        var urunler = new[]
        {
            new Urun { Numara = 1, Ad = "Kalem", Kategori = "Kırtasiye", Deger = 3 },
            new Urun { Numara = 2, Ad = "Elma", Kategori = "Manav", Deger = 4.2 }
        };

Süzme (Filter)

        // Değeri 3 olan dizi elemanları alınıyor
        var sonuc = (from c in dizi
                        where c == 3
                        select c);

        // 2 farklı kritere göre süzme
        var sonuc = (from c in urunler
                        where c.Kategori == "Manav" && c.Deger > 1
                        select c);

        // Lambda Syntax
        var sonuc = urunler.Where(c => c.Ad == "Elma");

Yansıtma (Projection)

        // Ürünlerin sadece belirli özellikleri listeleniyor.
        // Anonim tip geri döndürülüyor.
        var sonuc = (from c in urunler
                        select new
                        {
                            c.Numara,
                            c.Ad
                        });

        // Lambda Syntax
        var sonuc = urunler.Select(c => new
        {
            c.Numara,
            c.Ad
        });

Sıralama (Order)

        // Dizi tersten sıralanıyor.
        var sonuc = (from c in dizi
                        orderby c descending
                        select c);

        // Birden fazla alana göre sıralanıyor.
        // İlk olarak değere, daha sonra kategoriye göre sıralanır. (sondan başa doğru)
        var sonuc = (from c in urunler
                        orderby c.Kategori, c.Deger descending
                        select c);

        // Lambda Syntax
        var sonuc = urunler.OrderByDescending(c => c.Deger).ThenBy(c => c.Kategori);

Birleştirme (Join)

        // İki liste birleştirilerek, listelerin sadece belirli özellikleri alınıyor.
        var sonuc = (from c in dizi
                        join urun in urunler on c equals urun.Numara
                        select new
                        {
                            c,
                            urun.Ad
                        });

        // Left join
        var sonuc = (from c in dizi
                        join u1 in urunler on c equals u1.Numara into u2
                        from urun in u2.DefaultIfEmpty()
                        select new
                        {
                            c,
                            urun.Ad
                        });

Gruplama (Group)

        // Ürünler kategorilerine göre gruplanıyor.
        // Her bir kategori grubunda kaç adet ürün bulunduğu ve kategorinin toplam değeri listeleniyor.
        var sonuc = (from c in urunler
                        group c by c.Kategori into g
                        select new
                        {
                            Kategori = g.Key,
                            Adet = g.Count(),
                            ToplamDeger = g.Sum(k => k.Deger)
                        });

        // Birden fazla alana göre gruplama
        var sonuc = (from c in urunler
                        group c by new { c.Ad, c.Kategori } into g
                        select new
                        {
                            g.Key.Kategori,
                            Adet = g.Count(),
                            ToplamDeger = g.Sum(k => k.Deger)
                        });
Etiketler:  C#

C# Nesne Özelliklerine Varsayılan Değer Atama

tip

Bir nesne üzerindeki özelliklerin varsayılan değerlerini atama işlemi yapıcı içerisinde yapılmaktadır. C# 6.0 ile beraber bu işlem, artık özelliğin tanımlandığı yerde yapılabilmektedir.

Eski kullanım

    public class Ogrenci
    {
        public int Numara { get; }
        public string AdSoyad { get; set; }

        public Ogrenci()
        {
            this.Numara = 3;
            this.AdSoyad = "Selami Güngör";
        }
    }

Yeni kullanım

    public class Ogrenci
    {
        public int Numara { get; } = 3;
        public string AdSoyad { get; set; } = "Selami Güngör";
    }
Etiketler:  C#

C# 6.0 Null Kontrolü

tip

Bir nesnenin özelliklerine ya da metotlarına erişmeden önce, nesne değerinin null olup olmadığının kontrol edilmesi gerekmektedir. Aksi halde NullReferenceException hatası fırlatılır.

Örneğin, str adı tanımlanmış bir string nesnesinin uzunluğu alınmak isteniyor. Uzunluk alınmadan önce ilk olarak str değerinin null olup olmadığının kontrol edilmesi gerekiyor. C# 6.0 ile beraber, bu kontrol aşağıdaki gibi ?. operatörü ile yapılabilir.

var length = str?.Length;

İşlem sonunda, eğer str değeri null ise, null değeri döndürülür. Aksi halde string uzunluğu elde edilir.

Etiketler:  C#

Generic Singleton Pattern & C#

Generic Singleton pattern with C# and .NET 4 (or higher)

// T is a class and must have a public default constructor.

public sealed class Singleton<T> where T : class, new()
{
    private static readonly Lazy<T> instance = new Lazy<T>(() => new T());
        
    public static T Instance
    {
        get
        {
            return instance.Value;
        }
    }

    private Singleton() { }
}

Usage:

var myClass = Singleton<MyClass>.Instance;
Etiketler:  C#

.NET Proje - Website Health Monitoring

Website Health Monitoring sistemleri, web sitesinin çalışır durumda olup olmadığını, veritabanı bağlantısı, e-posta gönderimi gibi işlemlerin sorunsuz bir şekilde yapılıp yapılmadığını düzenli aralıklarla kontrol eden ve sorun tespit etmesi durumunda, ilgili kişileri uyaran sistemlerdir.

Proje ile, birçok web uygulamasını aynı anda kontrol eden, sonuçlara İnternet tarayıcısı ya da mobil uygulama üzerinden erişebileceğimiz, bulut üzerinden çalışan bir .NET uygulaması hazırlanması amaçlanmıştır.

Website Health Monitoring

Projede bileşenleri ve kullanılacak teknolojiler aşağıdaki gibidir:

ASP.NET MVC Web Uygulaması

Kontrol edilecek web sitelerini kaydetmek ve monitör edilen web sitelerinin raporlarına erişmek için hazırlanacak web uygulaması

Apache Cordova Mobil Uygulaması

Monitör raporlarına mobil cihazlar üzerinden erişmek ve sorunlar hakkında anlık uyarılar almak için hazırlanacak mobil uygulama

Windows Service

Web sitesi kontrol işlemlerinin, belirli aralıklarla otomatik olarak yapılması ve sorun tespiti sırasında yetkililerin uyarılması için hazırlanacak Windows servisi

SQL Server

Web sitesi verilerinin ve kontrol sonuçlarının tutulacağı veritabanı

LINQ to SQL

Veritanını üzerinde sorgulamalar yapma ve verileri yönetmek için kullanacağımız .NET bileşeni

SMTP

Sorunları web sitesi sahibi yetkililere bildirmek için kullanılacak, elektronik posta gönderme protokolü

C#, HTML, CSS

Uygulama C# ile yazılacaktır. Ekranlar için HTML ve CSS konuları konusunda bilgi sahibi olmak gerekecektir.

Julia Fraktal Çizimi & C#

Fraktal; matematikte, çoğunlukla kendine benzeme özelliği gösteren karmaşık geometrik şekillerin ortak adıdır. En bilinen fraktal kümelerinden birisi olan Julia kümesinin C# ile oluşturulmuş hali aşağıdadır.

julia

using System.Drawing;
using System.Numerics;

namespace SG.Algoritma
{
    public class JuliaFractal
    {
        // Julia kümesinde, yarıçağı 2'den büyük her karmaşık sayı çemberi sonsuza götürmektedir.
        private const int MaxMagnitude = 2;

        // Maksimum iterasyon sayısı
        private const int MaxIterations = 1000;

        // Karmaşık sayı koordinat sisteminde, Julia kümesinin bölgesi.
        // Julia kümesinin sadece bir kısmını çizmek için farklı bir bölge verilebilir. 
        private static Complex AreaMin = new Complex(-2, -2);
        private static Complex AreaMax = new Complex(2, 2);

        private Complex C;

        public JuliaFractal(Complex c)
        {
            this.C = c;
        }

        /// <summary>
        /// Julia kümesi imajı oluşturuluyor
        /// </summary>
        /// <param name="dimension">Oluşacak imajın genişlik ve yükseklik değeri (Kare imaj oluşturulacak)</param>
        public Bitmap GenerateBitmap(int dimension)
        {
            return this.GenerateBitmap(dimension, JuliaFractal.AreaMin, JuliaFractal.AreaMax);
        }

        /// <summary>
        /// Julia kümesi imajı oluşturuluyor
        /// </summary>
        /// <param name="width">Oluşacak imajın genişliği. Yükseklik, çizilmek istenen bölgeyenin genişlik ve yükseklik değerlerine bakılarak belirlenecek.</param>
        /// <param name="areaMin">Karmaşık sayo kooordinat sisteminde, Julia kümesinin sadece belirli bir bölgeye karşılık düşen kısmı çizdirilmek istendiği zaman, bu bölgenin sol alt kösesi</param>
        /// <param name="areaMax">Sağ üst köşe</param>
        public Bitmap GenerateBitmap(int width, Complex areaMin, Complex areaMax)
        {
            var height = (int)(width * (areaMax - areaMin).Imaginary / (areaMax - areaMin).Real);

            // Boş bir bitmap oluştur
            var bitmap = new Bitmap(width, height);

            // Oluşturulacak imajın her piksel değerine karşılık düşen karmaşık sayı oluşturulacak.
            // Oluşturacağımız karmaşık sayıların, seçtiğimiz bölge içerisinde kalması gerekmektedir.

            var rScale = (areaMax - areaMin).Real / width;
            var iScale = (areaMax - areaMin).Imaginary / height;

            for (var x = 0; x < width; x++)
            {
                // Karmaşık sayısının real kısmı
                var real = areaMin.Real + x * rScale;

                for (var y = 0; y < height; y++)
                {
                    // Karmaşık sayısının imaginary kısmı
                    var imaginary = areaMin.Imaginary + y * iScale;

                    // Julia kümesi iterasyon değeri hesaplanıyor.
                    var iteration = this.CalculateIteration(new Complex(real, imaginary));

                    // Iterasyon değerine göre noktanın rengi ayarlanıyor.
                    bitmap.SetPixel(x, y, JuliaFractal.GetColor(iteration));
                }
            }

            return bitmap;
        }

        private int CalculateIteration(Complex z)
        {
            var iteration = 0;

            while (iteration < JuliaFractal.MaxIterations && z.Magnitude < JuliaFractal.MaxMagnitude)
            {
                z = z * z + this.C;
                iteration++;
            }

            return iteration;
        }

        /// <summary>
        /// // Iterasyona karşılık renk seçiliyor.
        /// </summary>
        private static Color GetColor(int iteration)
        {
            // Rasgele bir renk seçiliyor.
            // 256 tane rengin olduğu bir liste oluşturularak, listeden iteration % 256. renk de seçilebilir.
            // Ya da renk oluşturmak için farklı bir yöntem izlenebilir.

            return Color.FromArgb(0, iteration % 256, 0);
        }
    }
}

Julia kümesini fraktal resmini oluşturmak için, ilgili metot aşağıdaki şekilde çağrılabilir. Bu durumda en üstte yer alan resim oluşacaktır.

var fractal = new JuliaFractal(new Complex(0.285, 0.01));
var bitmap = fractal.GenerateBitmap(800);

bitmap.Save(@"D:\julia.png", ImageFormat.Png);

Julia fraktalının sadece belirli bir bölgesini çizdirmek için, ilgili metot aşağıdaki şekilde çağrılabilir. Böylece fraktalın istenilen bölgesi daha detaylı bir şekilde çizdirilebilir.

var bitmap = fractal.GenerateBitmap(800, new Complex(-0.85, 0.1), new Complex(-0.45, 0.37));

julia

Etiketler:  C#

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
Sayfa 1 2 3

Kategoriler

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

Etiketler

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

İngilizce / Türkçe

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