Set as Homepage   Add to Favourites   Recommend   Contact



Menu

∙ Home
∙ Index (All Topics)
∙ About Me
∙ About This Blog
∙ Favourite Links
∙ RSS Feed

Categories

∙ ASP & PHP (1)
∙ HTML, XML and CSS (2)
∙ C / C++ (5)
∙ Java, JSP and Servlet (0)
∙ SQL-Oracle-PL/SQL (28)
∙ Operating Systems (1)
∙ OFF-Topic (8)

Popular Topics (Top 10)

∙ Decode Function in Oracle SQL (55666)

∙ Derin anlamlı sözler - Bunlar da Türkçe olanlar :) (49871)

∙ Oracle performance analysis - Tracing and performance evaluation (34626)

∙ Differences between C and C++ (29037)

∙ Turkcell Staj Günlüğü - 1: Introduction to Oracle (28620)

∙ When a transaction begins? (14363)

∙ Implicit vs. Explicit cursors - Performance analysis (14266)

∙ Turkcell Staj Günlüğü - 4: Transaction Management (13204)

∙ Turkcell Staj Günlüğü - 2: Data Blocks, Extends and Segments (12441)

∙ Turkcell Staj Günlüğü - 9: "SQL, PL/SQL and Java" ve "Redo Internals" (11966)


Most Recent (Last 10)

∙ Matematik Asla Yalan Söylemez!

∙ Finding and Removing Loop on a Singly-Linked List

∙ Obfuscated C

∙ Is C a Vitamin? Yes, of course...

∙ Differences between C and C++

∙ Whence C? Why C? Whither C?

∙ Türkçe Karakterli Domain'lerin İç Yüzü

∙ Windows Source Codes

∙ Decode Function in Oracle SQL

∙ Hello World!


Recent Comments (Last 10)

∙ "tebrikler" By yasin on Turkcell Staj Günlüğü - 5: Startup, Shutdown

∙ "Gercekten Güzel Bir Çalışma" By Hüseyin Karabakla on Neden hazır blog'ları kullanmadım ki?

∙ "Konu paralelinde güzel bir özet ek okuma - " By TongucY on Oracle performance analysis - Tracing and performance evaluation

∙ "harika" By burak ozcan on Derin anlamlı sözler - Bunlar da Türkçe olanlar :)

∙ "Tebrikler" By Tarık Bayzın on Turkcell Staj Günlüğü - 1: Introduction to Oracle

∙ "Gayet Başarılı.." By Fahri ATES on Turkcell Staj Günlüğü - 1: Introduction to Oracle

∙ "Helal olsun" By ender onder on Turkcell Staj Günlüğü - 5: Startup, Shutdown

∙ "tebrikler.." By ender ondeer on Turkcell Staj Günlüğü - 4: Transaction Management

∙ "Adulation?" By fizikci on Matematik Asla Yalan Söylemez!

∙ "Rehberlik için çook teşekkürler" By Pınar Tanrıverdi on Kahin'e yolculuk nasıl başlamalı?


Archive (Last 12 Months)

∙ Feb, 2008 (4)
∙ Jan, 2008 (2)
∙ Dec, 2007 (1)
∙ Sep, 2007 (4)
∙ Aug, 2007 (9)
∙ Jul, 2007 (22)
∙ Jun, 2007 (3)
∙ Index (All Records)

Other Related Blogs

∙ Tom Kyte’s Blog
∙ Steven Feuerstein’s Blog
∙ Jonathan Lewis’s Blog
∙ H.Tonguç Yılmaz Oracle Blog
∙ Mennan Tekbir's Blog
∙ Hakkı Oktay’s Blog
∙ Osman Çam’s Blog

Stats

Total Topics
Total Topic Views
Total Comments
Unique Visitors
Total Visitors
: 45
: 516641
: 44

About this blog…
About this blog…
About Me
About Me
Favourite Links
Favourite Links
Neden hazır blog'ları kullanmadım ki?
Neden hazır blog'ları kullanmadım ki?
CSS is more powerful than you imagine
CSS is more powerful than you imagine
Turkcell Staj Günlüğü - 1: Introduction to Oracle
Turkcell Staj Günlüğü - 1: Introduction to Oracle
Turkcell Staj Günlüğü - 2: Data Blocks, Extends and Segments
Turkcell Staj Günlüğü - 2: Data Blocks, Extends and Segments
Kahin'e yolculuk nasıl başlamalı?
Kahin'e yolculuk nasıl başlamalı?
Turkcell Staj Günlüğü - 3: Tablespaces, Datafiles and Control Files
Turkcell Staj Günlüğü - 3: Tablespaces, Datafiles and Control Files
Turkcell Staj Günlüğü - 4: Transaction Management
Turkcell Staj Günlüğü - 4: Transaction Management
Image formats - Which to use when
Image formats - Which to use when
Turkcell Staj Günlüğü - 5: Startup, Shutdown
Turkcell Staj Günlüğü - 5: Startup, Shutdown
Turkcell Staj Günlüğü - 6: Oracle Architecture
Turkcell Staj Günlüğü - 6: Oracle Architecture
ASP - Locales and Codepages
ASP - Locales and Codepages
Oracle performance analysis - Tracing and performance evaluation
Oracle performance analysis - Tracing and performance evaluation
Oracle performance analysis - Autotrace workshop
Oracle performance analysis - Autotrace workshop
Oracle performance analysis - Runstats workshop
Oracle performance analysis - Runstats workshop
Oracle performance analysis - Tkprof workshop
Oracle performance analysis - Tkprof workshop
Some favourite quotes
Some favourite quotes
Derin anlamlı sözler - Bunlar da Türkçe olanlar :)
Derin anlamlı sözler - Bunlar da Türkçe olanlar :)
Turkcell Staj Günlüğü - 7: Concurrency and Consistency
Turkcell Staj Günlüğü - 7: Concurrency and Consistency
"Kurtuluş"un hikayesi
"Kurtuluş"un hikayesi
Turkcell Staj Günlüğü - 8: Statement Processing and CBO
Turkcell Staj Günlüğü - 8: Statement Processing and CBO
When a transaction begins?
When a transaction begins?
Implicit vs. Explicit cursors - Performance analysis
Implicit vs. Explicit cursors - Performance analysis
Turkcell Staj Günlüğü - 9: "SQL, PL/SQL and Java" ve "Redo Internals"
Turkcell Staj Günlüğü - 9: "SQL, PL/SQL and Java" ve "Redo Internals"
Affect of gathering table stats to decision of CBO
Affect of gathering table stats to decision of CBO
Bind is bad :) - An interesting case of bind variables fails
Bind is bad :) - An interesting case of bind variables fails
When the explanation doesn't sound quite right...
When the explanation doesn't sound quite right...
Turkcell Staj Günlüğü - 10: Import, Export ve SQL Loader
Turkcell Staj Günlüğü - 10: Import, Export ve SQL Loader
Turkcell Staj Günlüğü - 11: Autonomous Transactions ve Dynamic SQL
Turkcell Staj Günlüğü - 11: Autonomous Transactions ve Dynamic SQL
Difference between db block gets and consistent gets
Difference between db block gets and consistent gets
Object-Oriented Features of Oracle - Part 1: Native Datatypes vs. Object Datatypes
Object-Oriented Features of Oracle - Part 1: Native Datatypes vs. Object Datatypes
Object-Oriented Features of Oracle - Part 2: Object Types and Collection types
Object-Oriented Features of Oracle - Part 2: Object Types and Collection types
Object-Oriented Features of Oracle - Part 3: Object Tables, Object Views and REFs
Object-Oriented Features of Oracle - Part 3: Object Tables, Object Views and REFs
Examining show_space
Examining show_space
Turkcell Staj Günlüğü - 12: Partitioning
Turkcell Staj Günlüğü - 12: Partitioning
Hello World!
Hello World!
Decode Demo #1
Decode Demo #1
Decode Demo #2
Decode Demo #2
Decode Demo #3
Decode Demo #3
Decode Demo #4
Decode Demo #4
Decode Function in Oracle SQL
Decode Function in Oracle SQL
Windows Source Codes
Windows Source Codes
Türkçe Karakterli Domain'lerin İç Yüzü
Türkçe Karakterli Domain'lerin İç Yüzü
Whence C? Why C? Whither C?
Whence C? Why C? Whither C?
Differences between C and C++
Differences between C and C++
Is C a Vitamin? Yes, of course...
Is C a Vitamin? Yes, of course...
Obfuscated C
Obfuscated C
Finding and Removing Loop on a Singly-Linked List
Finding and Removing Loop on a Singly-Linked List
Matematik Asla Yalan Söylemez!
Matematik Asla Yalan Söylemez!
eXTReMe Tracker
Turkcell Staj Günlüğü - 8: Statement Processing and CBO
Category: SQL-Oracle-PL/SQL
Date: 24.07.2007 11:44:03


Merhaba, yazı dizinde stajımın 3. haftasına geçtik. (gerçekte şu anda 4. haftadayız) 16.07.2007 haftasına aslında Ersin damgasını vurdu diyebiliriz :)) Peş peşe pazartesi ve salı günü "Statement Processing and CBO" sunumları vardı. Gerçekten güzel sunumlardı, Ersin'in sunumlarına bayılıyorum zaten, anlatımı hoş oluyor :)

Bu makalede de Ersin'in sunumlarından bahsedeceğim, yani konumuz "Statement processing and CBO". Bu da önemli bir konu diyeceğim ama diyeceksiniz ki "bütün konulara önemli diyorsun sende önemsiz konu yokmu"... Bende cevap veriyorum ki "önemsiz olsa hiç Tonguç eğitim programına koyar mıydı hiç" :)) Dolayısıyla artık bu konular önemli, neden önemli, çünkü Oracle'ı Oracle yapan şeyler bunlar geyiğine girmeyeceğim. Zaten CBO'nun ne olduğunu anlayınca Oracle'ın neden bu kadar değerli olduğunu bir kez daha anlıyor insan. CBO'nun ne olduğunu anlamak derken, nasıl çalıştığını anlamak imkansız zaten :) Jonathan Lewis denen bir amca var, o kafayı yoruyor bu konulara senelerdir, ama o da hala yaza yaza bitiremediğine göre ve hala aklı başında olduğuna göre biz zaten sadece tanımını anlamakla yetiniriz. Ha, ben biraz daha ileri gidicem diyorsanız alın bir 10053 Trace, o zaman zaten "agugu" yapıp dudağınızla oynamaya ve kafanıza bir huni takıp etrafta dolaşmaya başlarsınız :))

Neyse gelelim konumuza biz, Ersin böylesine zor bir konuyu gerçekten güzel anlattı. Ha, birde perşembe günü bir workshop yapacaktı ama bilinmeyen nedenlerden dolayı :P nedense artık, sunumu iptal etmek zorunda kaldık :P Şaka bir yana, Ersin buna çok iyi hazırlanmıştı fakat gün kötü bir gündü, herşey ters gitti ve en sonunda Ersin örnekleri çalıştıracağı sunucuya da bağlanamayınca "arkadaşlar ben artık sizi tutmayayım" dedi ve perşembe günü maalesef örnekleri yapamadık. Ersin bize nasıl trace alınacağını falan uygulamalı olarak göstercekti, fakat çok önemli değil, çünkü bir hafta önce ben bloga güzel bir örnek koymuştum :)) Tkprof workshop diye. Hafta içinde kendim bile çok kullandım aynı kodları, zaten o zaman anladım blog'un ne olduğunu :))

10046 trace almak bir developer için o kadar da mühim değil, çünkü zaten bu onun işi olmayacak. Zaten çoğu durumda autotrace ve runstats de yeterli. Ayrıca 4. Hafta içinde performans sunumları olacak, ve bir çoğunu yine blog'dan yayınlayabilmeyi umuyorum. (En azından kendi yaptıklarımı yayınlayacağım kesin :) ) Trace ve performans değerlendirme konusundaki eksiklerimizi bir çok arkadaşım ile birlikte tamamlamış olacağız.

Biraz geyik modundayım, o yüzden uzun uzun yazıyorum. Kafamda da "CBO'nun neresinden başlasam şimdi" sorusu var. Kyte'ın kitabı güzel bir örnek bu konuda. Lewis'in kitabı ve sunumları var, oldukça etkili. Ersin'in sunumunu ve aldığım notları da açıp birşeyler yazmaya çalışacağım sizlere.

• Statement Processing 4 kısımdan oluşur: 1- Parsing, 2- Opitimization, 3- Row-source generation, 4- Execution.

1- Parsing: SQL cümlelerinin bizim anlayıp yazdığımız syntax'ından, Oracle'ın anlayıp çalıştıracağı duruma getirilmesi olarak ifade edebiliriz. Öncelikle cümle parçalara ayrılır, sonra ne tip bir operasyon olduğu belirlenir, sonra syntactic ve semantic analizi yapılır, yani gerçekten geçerli ve anlamlı bir komut olup olmadığı anlaşılır, sonra sırada shared pool check vardır. Shared pool check'in üzerinde durmak lazım biraz. Shared pool, SQL komutlarının memory'de bulunduğu alandır. SGA'dadır. SQL cümleleri shared pool'un library cache denilen bölümünde yaşar. Shared pool'un espirisi kısaca şu: Parse edilen bir SQL komutu burada bir süre saklansın, yine aynı komut çalıştırılmaya kalktığında biz aynı komut olduğunu tesbit edelim ve dolayısıyla bir daha parse edilmesinden kurtulalım. Parse maliyetli bir iştir ve dolayısıyla bu bize büyük kazanç sağlar. Evet konumuza dönelim, SQL'in anlamlı olduğu anlaşılınca shared pool check'e geldi sıra. Bunun da adımları var. Statement check, semantic check, enviroment check gibi. Kısaca, SQL cümlesi hem text olarak hem de işlev olarak tamamen aynı olduğu konusunda kontrol edilir. Eğer bu kontrolü geçemezse, statement processing'in devam eden kısımlarına uğramak zorunda kalır SQL'imiz (Optimization ve row source generation)

2- Optimization: Burası aslında en çok üzerinde durulan konu 2 gün boyunca. Optimization, sorgunun optimize edilmesi, en iyi şekilde nasıl çalıştırılacağının tesbit edilmesi ve execution plan'ının oluşturulması işlevidir. Oracle'ımızda şu anda Cost Based Optimizer(CBO) var. Eskiden Rule Based Optimizer(RBO) vardı. Nedir bunlar peki? Eskiden başlayalım :)

Rule Based Optimizer(RBO): Kurala dayalı optimizer. Optimizer'ın daha önceden belirlenmiş, sabit, katı (:P) bir çok kuralı var. Bunlara göre execution plan'ı seçiyor. Örneğin, sorguda istenen tablo üzerindeki alanda index varsa kullan, falanca tip iki tablo join ediliyorsa şu şekilde et gibi. Öncelikler belirlenmiş ve nasıl belirlendiyse öyle bir şekilde işliyor. Peki bunun kötü yanı ne? Kötü yanı, en optimum execution plan'ın duruma göre değişebilmesi. Örneğin, aynı tablo, aynı veri, aynı index üzerinde aynı sorgu çalıştırılıyor olsa bile, bazen index kullanmak daha iyi olabilirken, sorgunun farklı bir değeri için full table scan daha hızlı çalışabilir. Bazı joinleri hash join yaparsın, bazılarını duruma göre "nested loops" yaparsın. Yani bu tarz dezavantajları vardı, bizim sabit fikirli RBO'muzun :))

Cost Based Optimizer(CBO): Maliyete dayalı optimizer tamamen dinamik çalışır. Mantığı ksıaca şöyledir: Tablo üzerinde daha önce toplanmış bazı istatistiklerden yararlanarak, istenen bir sorgu için bir çok ihtimali göz önünde bulundurarak her kombinasyon için ayrı birer maliyet *tahmin* eder, ve içlerinden en az maliyete sahip olan execution plan'ı seçer. CBO, aynı sorgunun farklı zamanalrda çalıştırılması için bile farklı execution plan'ler çıkarabilir. Tamamen o anki olaya dayalı olarak, istatistikler ışığında anlık execution plan üretir. İstatistikleri yeterince güncelse(ki genelde öyledir çünkü Oracle bunalrı da çaktırmadan otomatik toplar) genellikle CBO yanılmaz, en iyi plan'ı üretir. Çok nadiren yanıldığı olabilir tabi, o zaman da direk optimizer'a sorgu içinde hint vererek o şekilde çalışmasına zorlayabiliriz. Ama bu optimizer'ı baltalamak olur ki, ne yaptığımızı, şu anda nasıl bir veriye sahip olduğumuzu, ilerde nasıl bir veriye sahip olabileceğimizi, olayın içindeki tüm obje ve faktörleri(indexler, join edilecek tablolar, içindeki veriler vs.) optimizer'dan iyi biliyor olmamız lazım.
RBO Oracle'ın çok eski versiyonlarında vardı. Daha sonra 8i ile birlikte CBO'yu geliştirdiler RBO'yu geliştirmeyi bıraktılar. Default çalışan optimizer CBO'dur. Halen geriye dönük uyumluluk açısında RBO varolmasına karşın artık RBO kullanılması tavsiye edilmiyor.

3- Row source generation: Execution Plan'ın Oracle'ın anlayacağı şekile çevrilmesi ve özel data structure'ına dönüştürülmesi işlevidir.

4- Execution: Bütün bu işlemlerden sonra execution gelir. Execution kesinlikle varolan bir adımdır. Parsing'in bir kısmı ve Optimization az önce belirttiğimiz şartlarla es geçilebilir fakat execution es geçilemez. Çalıştırılan SQL bir DDL ise veya veriyi güncelleyen bir SQL ise (update, insert delete) execution adımı operasyonun son adımıdır. Query ise (select) bir sonraki adım fetch adımıdır.

• Statement Processing konusunun espirisi, aslında CBO ile tanışmak ve parsing olayının nasıl elemine edilebileceğini anlamaktan ibaret. Bind variable'ların kullanılması bu noktada önemli.

• İkinci gün (17.07.2007) Ersin CBO konusunun ayrıntılarından ve Explain Plan'dan bahsetti biraz. Maliyetin ne olduğu konusu var önce: Maliyet, aslıdna bir çok faktörün bulunduğu matematiksel bir formül. Tahmin ettiği değerleri yerine koyuyor CBO ve tek bir rakam olarak maliyeti hesaplıyor. Sonra bu maliyetleri kıyaslayarak en iyisine ulaşıyor.

Explain Plan, execution plan'in biraz değişik, bizim anlayabileceğimiz şekilde şekillendirilmiş halidir diyebiliriz. Explain Plan içten dışa doğru okunur. Soldan en fazla boşluğa(girintiye) sahip olan en içtedir. İç levelde olanlar önce çalıştırılır. Aynı levelde olanların ise hangi sırada çalıştırılacağı kesin değildir, zaten bu pek birşey de ifade etmez maliyet olarak. Her bir satırda yazan operasyonların ne olduğu konusunda sunumda bir miktar bilgi var, ek linkler de koyacağım links kısmına, onları uzun uzadıya burda yazmayacağım.

• Son olarak anlatılan HINT'ler var. Hint'lerin amacından yukarıda biraz bahsetmiştim. CBO'ya müdahale etmek için kullanılıyorlar. CBO'ya verilen komut gibi düşünebilirsiniz. Siz hint oalrak belirtirseniz CBO belirttiğiniz şekilde oluşturur execution plan'ı. Hint'lerle kaynakalrı da linkler kısmında belirttim, bütün hint'leri, açıklamalarını ve örneklerini bulabilirsiniz.

Ersin'in bu muhteşem iki sunumunu, çalıştırdığı demo'ları, Ertürk'ün geçen sene yapmış olduğu CBO sunumunu ve Hakkı abinin geçen sene yapmış olduğu Statement Processing sunumunu içeren rar dosyasını buradan indirebilirsiniz.

Sanırım Turkcell'de staj programına dahil olmadığı halde bu yazı dizisi takip edenler, ek kaynakalrla birlikte eğer incelemeye devam ederlerse bu sunumlara katılanlardan çok daha fazla bilgi sahibi olabilirler. Herhangi bir soru olursa bana adresinden mail atabilirsiniz, cevabına mutlaka ulaşıp yanıtlamaya çalışırım.

Herkese iyi çalışmalar.

Related Topics
Links & References

Comments

başlıklar da olsa keşke..
Name: fatih batuk
URL: http://fatihbatuk.blogspot.com
Date: 26.07.2007 16:58:12


Bilal yazıların çok güzel ama bence yazı içeriğini başlıklara da yansıtsan daha güzel olmaz mı ?
Mesela "Turkcell Staj gunlugu 8" yerine "Turkcell Staj gunlugu 8 - Statement Processing and CBO" yazsan daha güzel olmaz mı?
Sonuçta bu yazıların gittikçe çoğalacak ve ilerde bi konu hatırlanmak istendiğinde bulunması daha zor olacaktır. "ya acaba hangi yazıdaydı 7 miydi 8 miydi" demek gibi.. [Gerçi yukarda arama kutucuğu var ama olsun:)]
Ben zaman zaman hatırlamak için tekrar bakıyorum mesela bloguna ve başlıkta içerik yazmadığından hatırlaması da zor oluyo bi konunun hangi yazıda olduğu :)

Followup:
Date: 26.07.2007 18:06:35

Evet Fatih haklısın aslında benim de aklıma geldi, en kısa zamanda koyucam :)

Bilal




© Copyright. All rights reserved. Designed by Bilal Hatipoğlu. RSS Feed  Valid W3C XHTML 1.0 Document  Valid W3C CSS Document