28 Aralık 2010 Salı

Heap, Clustered İndeks ve Nonclustered İndeks Data Yapıları - Bölüm 1 (Tablo ve İndeks Organizasyonu, Heap Mimarisi)

1.Tablo ve İndeks Organizasyonu
Tablo Organizasyonu
Tablolar bir veya birden fazla partition ile oluşabilir. Her partition heap veya clustered indeks yapısında veri satırlarıdan oluşur.
Partition Organizasyonu
Partition kullanıcı tanımlı veri organizasyon birimidir. Tablolar varsayılan olarak bir partitiona sahiptirler. Bir tablo ve indeks, birden fazla partition içeriyorsa, veri yatay olarak bölümlenir. Partitionlar veritabanında bir veya daha fazla filegroup içerisine konulabilirler. Veri üzerinde sorgu ve updateler gerçekleştirilirken tablo veya indeksler tek mantıksal varlıklar olarak işlem görürler.
Clustered Tablolar, Heap ve İndeksler
SQL Server tabloları partitiondaki data pageleri organize etmek için iki metot kullanır:
1.Clustered Tablo: Clustered indeks içeren tablodur.
Veri satırları (data rows) clustered indeks anahtarının sırasıyla dosyada saklanır. Clustered indeks, clustered indeks anahtar değerine dayanarak daha hızlı satır erişimi sağlayan B-tree indeks yapısında yürütülür. İndeksin her seviyesindeki pageler(leaf seviyesindeki data pageler de dahil) doubly-linked list içerisinde bağlıdırlar. Ancak bir seviyeden diğerine dolaşmak key değerlerini kullanarak gerçekleşir.
2.Heap: Clustered indeks içermeyen tablodur.
Veri satırları özel bir sıralama içinde saklanmazlar, ve data pagelerin sırasında da özel bir sıralama yoktur. Data pageler linked list içinde bağlı değillerdir. Indexed Viewler de clustered tablolarla aynı yapıda saklanırlar. Heap veya clustered tablolar birden fazla partition içerirse, her partition kendine ait satır gruplarını içeren heap veya B-tree yapısına sahip olur. Örneğin bir clustered tablo dört partition içeriyorsa, dört tane B-tree yapısı vardır.

Nonclustered İndeksler
Nonclustered indeksler bir clustered indekse benzer B-tree indeks yapısına sahiptir. Farklı olarak nonclustered indeksler veri satırlarının sıralanmasını etkilemezler. Leaf seviyesi indeks satırlarını içerir. Her indeks satırı bir değer, satır göstergesi ve varsa included(veya nonkey) kolon içerir. Gösterge anahtar değerine sahip veri satırını işaret eder.
Bir allocation unit, kendi page tipindeki veriyi yönetmek için kullanılan heap veya B-tree içinde page grubudur. Aşağıdaki tabloda, tablo ve indeksin verisini yönetmek için kullanılan allocation unit tipleri listelenmektedir:
IN_ROW_DATA Veri veya indeks satırları Large Object Data (LOB) dışında tüm veriyi kapsar.
Pageler veri veya indeks tipleridir.
LOB_DATA Large Object veri text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max) veya user defined types data tipleri içinde depolanır.
Pageler text\Image tipleridir.
ROW_OVERFLOW_DATA Variable-Length veri, 8060 byte row size ile sınırlı varchar, nvarchar, varbinary ve sql_variant veri tiplerinde depolanır.
Pageler veri tipleridir.
2.Heap Mimarisi
Heap, clustered indeks içermeyen tablodur. Heap, heapte kullanılan her partition için sys.partitions içerisinde indid = 0 olan bir satır içerir. Heap ön değer olarak bir partitiona sahiptir. Eğer birden fazla partition oluşturulursa her biri kendine özel veri yapısını içeren bir heap yapısı içerir. Örneğin bir heap dört partition ise, burada dört heap yapısı vardır.
Heap içinde veri tipine bağlı olarak her heap yapısı, partitiona özel veriyi kaydetmek ve yönetmek için bir veya daha fazla yerleşim birimine(allocation unit) sahiptir. Her heap, her partition için minimum bir IN_ROW_DATA yerleşim birimine sahiptir. Heap eğer large object (LOB) kolon içeriyorsa her partition için bir de LOB_DATA yerleşim birimini içerir. Heap eğer 8060 byte row size ile sınırlanmış variable length kolon içeriyorsa her partition için bir de ROW_OVERFLOW_DATA yerleşim birimine sahiptir.
sys.system_internals_allocation_units sistem view içinde first_iam_page kolonu, heap yapısının boş alanlarını yöneten IAM page zincirindeki ilk IAM page göstergesidir. SQL Server IAM pageleri heaplere ulaşmak için kullanır. Data page ve rowlar bunları içinde özel bir sıralamada da değildir ve birbirine bağlı değildir. IAM pagelerin içine kaydedilmiş data pageler mantıksal olarak birbirine bağlıdır.
Tablo tarama ve heap okuma, heap için tutulan pagelerin alanlarını IAM pageleri tarayarak bulur. Çünkü IAM veri dosyasında bulunduğu sıra ile aynı sırada tutan bir alanı gösterir, yani Heap dosyaları birbirleriyle aynı sırada scan işlemi yapar.
Referanslar
1. http://msdn.microsoft.com
Serap PARLAK

5 Aralık 2010 Pazar

.NET FileSystemWatcher

FileSystemWatcher adından da anlaşılacağı üzere belirlenen bir dizini izleyen ve dosya sistemi üzerinde meydana gelen dosya olaylarını (Oluşturma, Silme, Yeniden Adlandırma ve Değiştirme) takip eden ve buna bağlı olarak olay tetikleyip işlem yapabileceğimiz çeşitli senaryolarda kullanabileceğimiz bir araç. FileSystemWatcher sınıfının belirli bir dizini, dosya tiplerini ve belirli olay durumlarına göre kullanabilmemiz için bir çok özellik ve olayları bulunmaktadır. Şimdi bunlara bir göz atalım. 
Özellikler:
Filter (string): Hangi tipteki dosyaların takip edileceğini filtrelemek için kullanılır ve varsayılan değeri “*.*” olup tüm dosya türlerini okur. Filtreleme örneği; “*.txt” değeri girildiğinde sadece metin dosyaları izlenecektir.
Path (string): İzlenecek dizin veya dosya yolunu tanımlar.
IncludeSubdirectories (bool): İzlenen dizinin alt dizinlerinin de izlenip, izlenmeyeceğini ayarlamak için kullanılır.
EnableRaisingEvents (bool): True olarak set edilmedikçe FileSystemWatcher olayları tetiklemez.
NotifyFilter (NotifyFilters): İzlenecek değişiklik türlerini tanımlamak için kullanılır.
Attributes: Dosya veya dizinin özellikleri.
CreationTime: Dosya veya dizinin oluşturulma tarihi.
DirectoryName: Dizin adı.
FileName: Dosya adı.
LastAccess : Dosya veya dizinin son açılma tarihi.
LastWrite: Dosya veya dizinin son değiştirilme tarihi.
Security: Dosya veya dizinin güvenlik ayarları.
Size: Dosya veya dizinin boyutu.

Olaylar:
Bahsettiğimiz gibi dosya olaylarını takip ederken aşağıdaki FileSystemWatcher olaylarını kullanırız.
Created ( Dosya veya Dizin Oluşturma durumunda çalışır.)
Deleted ( Silme durumunda çalışır.)
Changed (Değiştirme durumunda çalışır.)
Renamed ( Yeniden Adlandırma durumunda çalışır.)
Error (FileSystemWatcher tüm değişiklikleri yakalayamadığı durumlarda çalışır. )
Sınıfın özelliklerini ve olaylarını öğrendiğimize göre belirli bir klasörde meydana gelen değişiklikleri izleyen ufak bir servis uygulaması ile kullanımına bir göz atalım.
protected override void OnStart(string[] args)
{
            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Filter = "*.*";
            watcher.IncludeSubdirectories = true;
            watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.Size;
            watcher.Path = @"C:\TestDizini";
            watcher.Created += new FileSystemEventHandler(watcher_Created);
            watcher.Deleted += new FileSystemEventHandler(watcher_Deleted);
            watcher.Renamed += new RenamedEventHandler(watcher_Renamed);
            watcher.Changed += new FileSystemEventHandler(watcher_Changed);
            watcher.EnableRaisingEvents = true;
}
static void watcher_Changed(object sender, FileSystemEventArgs e)
{
            using (StreamWriter sw = new StreamWriter(@"C:\WatcherLog.txt", true))
            {
                sw.WriteLine(DateTime.Now.ToString() + " --> " + e.Name + e.ChangeType + " isimli dosya DEĞİŞTİRİLDİ.");
            }
}
static void watcher_Renamed(object sender, RenamedEventArgs e)
{
            using (StreamWriter sw = new StreamWriter(@"C:\WatcherLog.txt", true))
            {
                sw.WriteLine(DateTime.Now.ToString() + " --> " + e.OldName + " isimli dosya " + e.Name + " olarak YENİDEN ADLANDIRILDI.");
            }
}
static void watcher_Created(object sender, FileSystemEventArgs e)
{
            using (StreamWriter sw = new StreamWriter(@"C:\WatcherLog.txt", true))
            {
                sw.WriteLine(DateTime.Now.ToString() + " --> " + e.Name + " isimli dosya OLUŞTURULDU.");
            }
}
static void watcher_Deleted(object sender, FileSystemEventArgs e)
{
            using (StreamWriter sw = new StreamWriter(@"C:\WatcherLog.txt", true))
            {
                sw.WriteLine(DateTime.Now.ToString() + " --> " + e.Name + " isimli dosya SİLİNDİ.");
            }
}
Cihan DEMİREL