Pages

20 Ocak 2012 Cuma

Birleşmelerde sorgu geliştiricinin uygun yürütme planını seçmesi

Sorgu geliştirici, bir yürütme planının seçilmesi esnasında aşağıdakileri değerlendirmeye almaktadır:

·         Sorgu geliştirici, önce en azından bir veya birden fazla tablo birleşmesinin kesinlikle en az bir satır içeren bir satır kaynağı olarak sonuçlanıp sonuçlanmayacağını belirler. Sorgu geliştirici, bu gibi durumları tablodaki UNIQUE ve PRIMARY KEY kısıtlamalarına bağlı olarak  tanımaktadır. Eğer böyle bir durum mevcutsa, o zaman sorgu geliştirici bu tablolaları ilk olarak birleşme sırasına göre yerleştirir. Ardından, geri kalan tablo kümelerinin birleşmesi işlemine gelinir.
·         Dış(outer) birleşme durumları ile birleşme komutları için, dış birleşme operatörü olan tablo, birleşme sırasında bu durum için diğer tablodan daha sonra gelmelidir. Sorgu geliştirici, bu kuralı ihlal eden birleşme sıralarını değerlendirmeye almaz. Benzer olarak,  bir altsorgu yarı birleşme ve anti birleşmelere dönüştürüldüğünde, bu alt sorgunun tabloları dış sorgu bloğunda bağlı olunan veya ilişkideki tablolardan daha  sonra gelmelidir. Ancak, bazı durumlarda karma(hash) anti birleşmelerin ve yarı birleşmelerin(semijoins) bu sıralama durumunu geçersiz kılması mümkün olmaktadır.

Sorgu geliştirici ile muhtemel birleşme sırasına, birleşme metoduna ve uygun erişim yollarına bağlı olarak  bir yürütme planı kümesi oluşturulur. Ardından, herbir planın maliyeti değerlendirilir ve en düşük maliyete sahip olan seçilir. Sorgu geliştirici, bu maliyetleri aşağıdaki şekillerde değerlendirmeye almaktadır:

·         İçiçe döngü(nested loops) işlemlerinin maliyeti, dış tablodan seçilen herbir satırın ve her bir dış satırın iç tablodan eşleştiği satırların belleğe okunma maliyetine dayalıdır. Sorgu geliştirici, data dictionary’deki istatistikleri kullanarak bu maliyetleri değerlendirir.
·         “Sort merge join”  tipi birleşmenin maliyeti,  tüm kaynakların belleğe okunması ve bellekten sort edilmesi işlemine bağlıdır.
·         “Karma(merge) birleşme” tipi birleşmenin maliyeti,  birleşmeye giriş tarafının bir tarafında bir karma tablo oluşturup, birleşmenin diğer tarafındaki satırları kullanarak derinlemesine araştırma yapma maliyetine dayalıdır.

Sorgu geliştirici, herbir işlemin maliyetini belirlerken aşağıdaki gibi çeşitli faktörleride değerlendirmeye almaktadır.

1.    Daha küçük bir sort alan büyüklüğü, “sort merge join” için maliyeti muhtemelen yükseltir, çünkü daha küçük sort alanında sort işlemi daha fazla CPU zamanı kullanır. 
2.    Daha geniş bir çoklu blok okuması, muhtemelen bir “sort merge join” işleminin içiçe döngü birleşmesi işlemiyle ilgili maliyetini azaltacaktır. Eğer, veritabanı tekli bir I/O içinde diskten daha büyük ardışık blokları okursa,  o zaman içiçe döngü birleşmesi için iç tablodaki indeks muhtemelen tam tablo taraması üzerinden performansı artıracaktır.  Çoklu blok okuması sayısı, DB_FILE_ MULTIBLOCK_READ_COUNT başlangıç parametresince tanımlanmaktadır.

Sorgu geliştiricinin birleşme sırası seçimini geçersiz kılmak için sorguda ORDERED hinti kullanılabilir. Eğer, ORDERED hinti dış birleşme için kuralı ihlal eden bir birleşme sırasını belirtirse, bu durumda geliştirici bu hinti değerlendirmeye almaz ve kendi belirlediği birleşme sırasını seçer. Ayrıca,  hintler ile geliştiricinin birleşme metodu seçimleride geçersiz kılınabilir.

Nested Loop Joins (İçiçe döngü birleşmeleri)

İçiçe döngü, küçük veri alt kümelerinde birleşmelerde kullanışlıdır. İç tablonun, dış tablodan bağımlı olarak sevk edildiğinden emin olunması önemlidir. Eğer iç tablonun erişim yolu dış tablodan bağımsızsa, bu durumda dış döngünün her bir tekrarı için aynı satırlar döndürülerek, bu bloklar tekrar tekrar yeniden ziyaret edildiğinden dolayı daha düşük mantıksal I/O performansı oluşmaktadır. Bu gibi durumlarda, iki bağımsız satır kaynağını birleştiren karma(hash) birleştirmeler daha iyi performans gösterecektir.

Bir içiçe döngü birleşmesi aşağıdaki adımları kapsamaktadır:

1. Sorgu geliştirici sevk edici tabloyu belirler ve bu tabloyu dış tablo olarak atar.
2. Diğer tablo iç tablo olarak tanımlanır.
3. Dış tablodaki herbir satır için, Oracle iç tablodaki tüm satırlara erişir. Dış döngü, dış tablodaki her bir satır içindir, iç döngüde iç tablodaki her bir satır içindir.  Dış döngü, aşağıdaki gibi yürütme planında iç döngü öncesinde ortaya çıkar.

NESTED LOOPS
dış döngü (outer_loop)
iç döngü (inner_loop)

Oracle 11g itibariyle fiziksel I/O için tüm gecikmeleri azaltmak için içiçe döngü birleşmelerinde yeni bir uygulama mevcuttur. Buffer cache içinde bir indeks veya tablo bloğu yoksa ve birleşmenin gerçekleşmesi için bu indeks veya tablo blokları gerekliyse, fiziksel I/O işlemi yapılmalıdır. Oracle 11g birçok fiziksel I/O talebini yığınlamaktadır ve bunları tek bir seferde işlemek yerine, taşıyıcı I/O kullanarak bunları işlemeyi tercih eder.  

İçiçe döngü birleşmelerinde yeni uygulamanın bir parçası olarak, iki içiçe birleşme satır kaynağı yürütme planında görülebilmektedir, daha önceki sürümlerde sadece bir tanesi görülebilmekteydi.  Bu gibi durumlarda, Oracle bir içiçe döngü birleşme satır kaynağını, birleşmenin dış tarafındaki tablonun değerlerini iç taraftaki indeks ile birleştirmek için tahsis etmektedir.  İkinci satır kaynağı, birleşmenin iç tarafındaki tablo ile indekslerde saklanan satır idlerini(rowid) içeren ilk birleşmenin sonucunu birleştirmek için tahsis edilir.

Sorgu geliştiricinin içiçe döngü birleşmelerini kullanması

Sorgu geliştirici içiçe döngü birleşmelerini, iki tablo arasında iyi sevk şartları içerecek az sayıda satırların birleşmesinde tercih etmektedir. Dış döngüden iç döngüye doğru sevk olmaktadır, böylece yürütme planında tabloların sıralaması önem kazanmaktadır.

Dış döngü kaynak satırını sevk eder. Birleşme koşullarını sevk ettirmek için bir satır kümesi oluşturulur. Satır kaynağı,  bir indeks taraması veya full tablo taraması kullanılarak erişilen bir tablo olabilir. Ayrıca, satırlar başka bir işlem tarafındanda oluşturulabilir. Örneğin;  içiçe döngü birleşmesinin çıktısı, başka bir içiçe döngü birleşmesi için kaynak satırı olarak hizmet verebilir.

İçiçe döngü, dış döngüden dönen(bilhassa indeks taramasıyla) her bir satır için tekrarlanmaktadır. Eğer iç döngü için erişim yolu dış döngüyle bağımlı değilse, o zaman kartezyen birleşme ile sonlandırılabilir, yani dış döngünün her bir tekrarı için  iç döngü aynı satır kümesini oluşturacaktır. Bu sebeple, iki bağımsız satır kaynağı birbiriyle birleşeceğinde, başka bir birleşme metodunun kullanılması gerekmektedir.

İçiçe döngü birleşmesi hintleri

Eğer geliştirici başka bir bir birleşme metodu kullanma eğilimindeyse, o zaman USE_NL(tablo1 tablo2) hinti kullanılarak ilgili tablolar içiçe döngü birleşmesi metoduyla birleştirilmeye zorlanabilir.

Karma(hash) birleşmeler

Karma birleşmeler, büyük veri kümelerinin birleştirilmesinde kullanılmaktadır. Geliştirici, iki tablonun enküçüğünü veya veri kaynağının en küçüğünü, bellek içinde birleşme anahtarında bir karma tablo inşa etmek için kullanır. Ardından büyük tabloyu tarayarak karma tabloda sondaj ile birleşecek satırları bulur. Bu metot küçük tablonun bellek içine sığabildiği durumlarda oldukça kullanışlıdır. Maliyet ise, iki tablonun verisi üzerinden tek okumanın geçmesi ile sınırlandırılır. 

Sorgu geliştiricinin karma birleşmelerini kullanması

Sorgu geliştirici, eğer iki tablo eşit birleşme kullanarak birleşiyorsa veya aşağıdaki durumlardan birisi oluştuğunda, karma birleşmesini kullanmaktadır.

·         Büyük miktarda veri birleşmek zorunda olduğunda.
·         Küçük tablonun büyük bir bölümü birleştirildiğinde.

USE_HASH hinti sorguya eklenerek iki tablonun birleşmesinde geliştiricinin karma birleşmeyi zorunlu kılması sağlanabilir.  

“Sort Merge” Birleşmeler

“Sort merge” birleşme, iki bağımsız kaynaktan satırları birleştirmektedir. Karma birleşmeler genellikle “sort merge” birleşmelerden daha iyi performans gösterir. Ancak,  aşağıdaki durumlarda “sort merge” birleşmeler karma birleşmelerden daha iyi performans gösterir.

·         Satır kaynaklarına halihazırda sort edilmişse.
·         Yapılacak bir sort işlemi bulunamamışsa.

Ancak, eğer bir “sort merge” birleşmesi, daha yavaş bir erişim metodunu( indeks taraması yerine full tablo taraması) seçimini gerektiriyorsa, o zaman “sort merge” kullanımının faydası kaybolabilir. “Sort merge” birleşmeleri, iki tablo arasındaki birleşme koşulunun eşitsizlik durumu olduğu durumlarda(<, <=, >, veya >=) kullanışlıdır. “Sort merge” birleşmeler geniş veri kümeleri  için içiçe döngü birleşmelerinden daha performanslıdır. Karma birleşmeler eşitlik koşulu olmadan kullanılamaz.

“Merge” birleşmelerde sevk tablosu konsepti yoktur. Birleşme aşağıdaki gibi 2 adımdan oluşur.

1. Sort birleşme işlemi: Her iki giriş birleşme anahtarı üzerinde sort edilir.
2. Merge birleşme işlemi: Sort edilen listeler birbiriyle kaynaşır.

Eğer giriş birleşme kolonunca sort edilirse, o zaman bu satır kaynağı için bir sort birleşme işlemi gerçekleşmez. Ancak, bir “sort merge” birleşme her zaman  birleşmenin sağ tarafı için konumlandırılabilir bir sort tamponu oluşturur, böylece birleşmenin sol tarafından gelen duplike birleşme anahtar değerler geldiği en son eşleşilen durumu geri arayabilecektir. 

Sorgu geliştiricinin “sort merge” birleşmelerini kullanması

Geliştiricinin “sort merge“ birleşmeyi zorunlu kılması için sorguda USE_MERGE hinti kullanılabilir. Ayrıca hintlerde zorlanılacak erişim yoluda belirtilebilir. Geliştiricinin USE_MERGE hinti ile geçersiz olacağı bazı durumlarda mevcuttur, örneğin geliştirici tabloda full tarama seçebilir ve sorguda sort işlemini önleyebilir. Ancak, full tablo taraması üzerinden hızlı erişim yerine indeks üzerinden geniş tablo erişimi ve tekli blok okumaları yüzünden artan bir maliyet olacaktır. 

0 yorum:

Yorum Gönder