ÇözümPark'a hoş geldiniz. Oturum Aç | Üye Ol
 
Ana Sayfa Makale Video Forum Resimler Dosyalar Etkinlik Hizmetlerimiz Biz Kimiz

Oracle

Oracle Sql Performance Analyzer İle Sql Komutlarının İyileştirilmesi

Oracle Database 11g Sürüm 1 (11gR1) sürümü ile kullanıma sunulan SQL Performance Analyzer aracı, zayıf performans gösteren SQL komutlarının mevcut durumu ve gerekli düzeltme işlemi sonunda performanslarında meydana gelen değişimleri test ortamında kıyaslayarak, kaynak kullanımında ve çalıştırma planı maliyetinde meydana gelen olumlu/olumsuz gelişimleri okunabilir rapor formatında hazırlayarak, veritabanı yöneticilerine SQL cümlelerinin iyileştirilmesinin veritabanı üzerinde olumlu etkisini kolayca görmesini sağlanır. SQL Performance Analzyer aracında kıyaslama için önceki ve sonraki olarak adlandırılan iki tür şablon kullanılmaktadır. “Önceki” kelimesinden kasıt; herhangi bir iyileştirme yapılmadan çalıştırılan zayıf SQL komutlarının mevcut durumudur. “Sonraki” ise; gerekli yapısal iyileştirme yapıldıktan sonra bu konfigürasyon değişikliğinin sistem üzerinde ne tür performans geliştirmesi yapacağının testine imkan veren bir analiz ve simülasyon metodudur.

Bu makelede, zayıf SQL komutlarının“önceki” ve “sonraki” arasındaki performans değişimlerini kıyaslama simülasyonu yer alacak ve performans değişim sonuçlarının zengin formatta raporlanması bir örnek ile yapılandırılacaktır. Oracle Enterprise Manager(OEM) grafiksel arayüzünde yer alan adım-adım sihirbazlar yardımıyla oluşturulacak olan SQL Performans Analyzer görevinde “önceki “ve “sonrası” arasındaki değişikliklerinin kıyaslama simülasyonu kolayca yapılmaktadır. Bu işlem için izlenecek adımlar aşağıda sırasıyla yer almaktadır.

  • Oracle veritabanındaki örnek yükü kapsayacak olan zayıf performansa sahip SQL komutlarının yakalanması(SQL Tunin setler yardımıyla).
  • Mevcut veritabanı sistemini kullanarak “önceki” olarak adlandırılan imajı/şablonu oluşturmak için örnek işyükünün mevcut performans etkisinin belirlenmesi.
  • Oracle veritabanı sisteminde yapılan yapısal değişiklik sonucunda mevcut işyükünün “sonraki” durumuna karşılık değişim göstermiş performansının test edilmesi.
  • Yapılan yapısal değişim sonucu hangi işyükü komponentlerinde pozitif veya negatif yönde değişim meydana geldiğinin bulunması için “önceki” ve “sonraki” arasında kıyaslamanın yapılması ,ayrıca hangi işyükü komponentleirnde değişiklik olmadığının tespiti.
  • Zayıf performans gösteren SQL komponentlerinin nasıl en iyi şekilde düzeltileceğinin belirlenmesi, böylece yeni ortamda bu SQL komutlarının en iyi şekilde çalışacağından emin olunması.

SQL Performance Analyzer aracının çalışmasını göstermek için, bu yazıda kullanılacak olan örnek tabloların oluşturulması ve SQL komutlarının beliritildiği adımları, “önceki” ve “sonraki” değişim simülasyonları ile birlikte aşağıdaki gibi yapılandıracağım.

1 - Simülasyon hazırlığı: Bu yazı için kullanacağım tabloları Oracle veritabanındaki örnek şemalardan biri olan OE şemasındaki objelerden türeteceğim. Bunun yanında bu tabloların güncel istatistiklerinin alınmasıda bu adımda yer alacaktır

CONN OE/OE

CREATE TABLE CUSTOMERSD AS SELECT * FROM CUSTOMERS;

CREATE TABLE ORDERSD AS SELECT * FROM ORDERS;

CREATE TABLE ORDER_ITEMSD AS SELECT * FROM ORDER_ITEMS;

CREATE TABLE PRODUCT_INFORMATIOND AS SELECT * FROM PRODUCT_INFORMATION;

--- İstatistikleri topluyoruz.---

EXEC DBMS_STATS.GATHER_TABLE_STATS(‘OE’,’CUSTOMERSD’,cascade=> true);

EXEC DBMS_STATS.GATHER_TABLE_STATS(‘OE’,’ORDERSD’,cascade=> true);

EXEC DBMS_STATS.GATHER_TABLE_STATS(‘OE’,’ORDER_ITEMSD’,cascade=> true);

EXEC DBMS_STATS.GATHER_TABLE_STATS(‘OE’,’PRODUCT_INFORMATIOND’,cascade=> true);

2 - SQL komutlarının toplanmasına hazırlık: Ardından, yukarda oluşturduğum tablolara erişim sağlamak üzere Oracle veritabanınında aşağıdaki iki adet SQL komutunu çalıştırıyorum.

select a.customer_id,a.cust_first_name||' '||a.cust_last_name Customer, b.order_id, b.order_total, d.product_name, c.unit_price, c.quantity,d.supplier_id

from customersd a, ordersd b,order_itemsd c, product_informationd d

where a.customer_id=b.customer_id

and b.order_id=c.order_id

and c.product_id=d.product_id

and a.customer_id=144;

select a.customer_id,b.order_date,c.order_id,d.product_name,d.list_price

from customersd a,ordersd b,order_itemsd c,product_informationd d

where a.customer_id=b.customer_id

and b.order_id=c.order_id

and d.product_id=c.product_id

and c.order_id in

(select order_id

from ordersd

where order_status=3);

3 -  “Önceki” olarak adlandırılan şablonun hazırlanması: “Önceki” olarak adlandıracağım şablonun test için hazır olmasından itibaren yukardaki SQL komutlarını içerecek olan SQL Tuning Task hazırlanması işlemine geçeceğim. Ardından, bu oluşturulan SQL Tuning Set, SQL Performance Analyzer görevi içerisine eklenecek ve performans kıyaslaması için “sonraki” olarak adlandırılacak şablona karşı kullanılmak üzere SQL Performance Analyzer görevi içerisinden “önceki” larak adlandırılan adımda çalıştırılacaktır.

4 - Veritabanında yapısal değişiklik yapılması: “Sonraki” olarak adlandırdığım şablonu hazırlamadan önce veritabanında mevcut SQL komutlarının çalıştırma planını ve kaynak kullanım istatistiklerini optimize edebilecek olan iyileştirme işlemlerine geçeceğim. Bu amaçla bu noktada; üç adet indeks oluşturacağım. Bu indekslerden birisi CUSTOMERSD tablosundaki CUSTOMER_ID kolonunu indeksleyecek, ikincisi ORDER_ITEMSD tablosundaki ORDER_ID ve ORDER_STATUS kolonlarını birlikte indeksleyecektir, üçüncüsü ise PRODUCT_INFORMATIOND tablosundaki PRODUCT_ID kolonunu indeksleyecektir. Daha sonra, doğru bir çalıştırma planı oluşturabilmek için bu indeksleme yapılan tabloların istatistikleri yeniden toplanacaktır.

CREATE INDEX CUSTID_IDX ON CUSTOMERSD(CUSTOMER_ID)PCTFREE 30;

CREATE INDEX ORDITMS_IDX ON ORDER_ITEMSD(ORDER_ID,ORDER_STATUS)PCTFREE 20;

CREATE INDEX PRODID_IDX ON PRODUCT_INFORMATION(PRODUCT_ID)PCTFREE 25;

--- İstatistikleri topluyoruz.---

EXEC DBMS_STATS.GATHER_TABLE_STATS(‘OE’,’CUSTOMERSD’,cascade=> true);

EXEC DBMS_STATS.GATHER_TABLE_STATS(‘OE’,’ORDERSD’,cascade=> true);

EXEC DBMS_STATS.GATHER_TABLE_STATS(‘OE’,’ORDER_ITEMSD’,cascade=> true);

EXEC DBMS_STATS.GATHER_TABLE_STATS(‘OE’,’PRODUCT_INFORMATIOND’,cascade=> true);

5 -  “Sonraki” olarak adlandırılan performans şablonunun oluşturulması: Değişikliklerin orjinal özdeş işyükünde sonuçlarını belirlemek için, SQL Performance Analyzer içerisinde “sonraki” adımında çalıştıracağım.

6 - “Önceki “ ve “Sonraki” şablonlarının sonuçlarının kıyaslaması: Son adımda ise “önceki” ve “sonraki” şablonlarında elde edilen bulgular birbiriyle kıyaslanacak ve bir rapor ile çalıştırma planı üzerilerinde değişimler, kaynak kullanım istatistikleri arasındaki değişimler pozitif ve/veya negatif yönden kolaylıkla görülebilecektir. Bu şekilde yapılacak değişimin üretim ortamına etkileri test ortamında simüle edilebilecek ve SQL komutlarının performanslarının gerçek platform için iyileştirmesi için çok etkili bir simülasyon ortamı oluşturulmuş olacaktır.

Şimdi yukarda bahsettiğim adımları Oracle Enterprise Manager(OEM) grafiksel arayüzünden adım adım uygulayalım:

1.)    İlk adımda iyileştirme yapılması planlanan SQL komutlarını içerecek olan SQL Tuning Set’inin oluşturulması gerekmektedir. Bu amaçla Oracle Enterprise Manager konsolundan “Performance” tabı altında yer alan “SQL Tuning Set” linkine tıklıyorum ve alttaki ilk adım ekrana geliyor.

image001

SQL Tuning Set oluşturmasının ikinci adımında hedef SQL komutlarının nereden yakalanacağı ile ilgili kısım yer almaktadır. “Data Source” kısmında yer alan değerler;

·         AWR snapshots – otomatik iş yükü ambarında kayıtlı olan SQL komutları ile geçmişte çalıştırılan SQL komutları yakalanabilir. Ne kadar geçmişe gidileceği AWR snapshots kısmında seçilir.

·         Cursor Cache – Henüz AWR raporuna yazılmamış ve önbellek içinde yer alan SQL komutları yakalanır.

Eğer imleç önbelleği içerisinden belirli zaman aralığında(duration) birden çok çalıştırılan ve imleç kullanan SQL komutları yakalanmak isteniyorsa bu durumda ilk kısım seçilmelidir. Benim örneğimde tek sefer çalıştırılan SQL komutları yüklenmek istendiğinden ben ikinci kısmı seçiyorum ve burada “Cursor Cache” seçeneğini seçip aşağıdaki gibi ilerliyorum.

image002

Ardından hangi SQL komutlarının yakalanacağı ile ilgili filtreleme alanına gelinir. Bu alanda ilgili şemaya ait SQL komutu gibi filtreleme seçenekleri mevcuttur. Bunun yanında eğer SQL cümlesinin ID si biliniyorsa bu filtre alanına direkt bu SQL ID de belirtilebilir. Ben SQL ID yi bilmediğimden ve bu komutları OE şemasından çalıştırdığımdan aşağıdaki gibi tanımlama yapıp ilerliyorum.

image003

BU SQL Tuning Setin hemen çalıştılıp ilgili SQL komutlarını toplamasını istediğimden bu görevin hemen çalışması için “immediatelly” kısmını işaretleyip ilerliyorum.

image004

Son aşamada ise oluşturduğumuz SQL Tuning Set ekranda listelenir.

image005

2.)    SQL Tuning Set oluşturulduktan ve içerisine hedef SQL komutları yüklendikten sonra artık SQL Performance Analyzer aracı çalıştırılmalıdır. SQL Performance Analyzer aracıda ana konsoldaki “Performance” tabı altından çalıştırılmaktadır. Ekranda gözüken “Guided Workflow “ ile “önceki” ve “sonraki” performans kıyaslaması işlemine başlayacağız. Bu aşamada yer alan diğer seçenekler ile ilgili makaleleri ilerleyen zamanlarda yayınlayacağımdan bunların ne anlama geldiği konusuna girmiyorum.

image006

image007

Guided Wokflow “ ile aslında Oracle tüm aşamaları iş akışı şeklinde adım adım basite indirgenmektedir. İlk sıradaki görevin yanındaki “Execute” sembolüne tıklayarak işleme başlıyorum.

image008

Oluşturacağım SQL Performance Analyzer görevine DEMO SPA adını veriyorum, SQL Tuning Set bölümü altında bir önceki adımda oluşturduğum SQL Tuning Setini tanımlayarak “CREATE” komutu ile bir sonraki adıma ilerliyorum.

image009

Bir sonraki aşamada mevcut ortamda SQL denemesini oluşturuyorum. Bu kısımda önemli olan nokta Creation Method ve Per-SQL Time Limit kısımlarıdır. “Creation Method” kısmında; çalıştırılan SQL komutunun lokal ortamdamı yoksa uzak bir makinede varsayımı ile simulasyonu yapılacağı, veya lokal veya uzak makine varsayımı ile SQL komutunun çalıştırma planı simülasyonumu yapılacak, yoksa hem SQL komutu çalıştırma planı hemde çalışma esnasında kaynak kullanımı ile ilgili detay istatistikleme simülasyonu yapılacak gibi seçenekler yer alır. “Execute SQLs locally” ile lokal veritabanında çalıştırılan SQL komutlarının hem kaynak kullanımı detayları istatistiki olarak simüle edilmekte, hemde çalıştırma planı detayları bu simülasyona dahil edilmektedir. “Per-SQL Time Limit” kısmı ise bu test ortamında yüklü SQL komutunun ne kadar süre deneme simülasyonunda tutulacağını belirtir. Aşağıdaki seçenekler ile ilerliyorum ve “önceki” olarak adlandırılan şablonu hazırlamış oluyorum.

*** Bu aşamada karşınıza gelen ekranın sağ alt kısmındaki “Trial environment established” seçeneğini tıklamayı unutmayın. ***

 

image010

Bir sonraki aşamaya geçmeden önce mevcut veritabanı ortamında değişiklik yapıyorum ve bu aşamada ilgili indeksleri oluşturup, gerekli istatistikleri yeniden topluyorum(bakınız 4. adım Veritabanında yapısal değişiklik yapılması) Bu işlem sonunda aşağıdaki gibi üçüncü görev alanınında “execute” sembolüne tıklayarak, “sonraki” olarak adlandırılan şablonun oluşturulması işlemine geçiyorum.

image011

“Sonraki” kısmındaki tanımlamalarım “önceki” aşamasındaki ile aynıdır.

image012

Bir sonraki aşamada “önceki” ve “sonraki” aşamalarının kıyaslaması işlemi yapılacaktır, alttaki gibi ilerliyorum.

image013

Kıyaslama metodu için kullanılacak kıstası belirliyorum. Bu kıyaslama metrikleri aşağıda yer almaktadır. Ben bu örnekte “buffer gets “ kıstasını kullanacağım. Rapor alındıktan sonra diğer metrikler içinde kıyaslama raporu alınabilmektedir.

Elapsed Time     - SQL komutunun ne kadar sürede tamamlandığı

CPU Time            - Bu komut için İşlemci çalışma zamanı

User I/O Time    - Bu işlem için I/O süresi

Buffer Gets        - Bu komut sonuçseti için önbellekten alınan veri miktarı

Physical I/Os     - Bu komut sonuçseti için fiziksel diskten alınan veri miktarı

Optimizer Cost  - İyileştirici maliyeti

I/O interconnect bytes - Cluster ortamı için düğümler arası bağlantılarda transfer olan veri miktarı

 

image014

Son aşamada deneme ortamında kıyaslama raporunu alacağım.

image015

Aşağıdaki gibi bu SQL Performance Analiz görevinde oluşturulan kıyaslama raporu görülmektedir. Gerekli iyileştirmeler sonucunda perfromansın iyileştiği “Improvedgrafiğindende görülmektedir.

image016

image017

Örnek SQL cümlelerinden birisinin SQL ID si üzerine tıklayarak bu SQL cümlesi ile ilgili çalıştırma planı istatistiklerini “önceki” ve “sonraki” olarak ayrı ayrı görebilmekte olup aradaki değişimin etkisini yüzdesel olarakta görebilmekteyiz.

image018

Bunun yanında “önceki” ve “sonraki” test ortamlarının simülasyon edilmiş çalıştırma planları aşağıda yer almaktadır. İndekslerin sisteme eklenmesi sonucunda cost değerinde bir azalma meydana gelmiştir.

image019

image020

Bir sonraki makalede, SQL Performance Analyzer aracı kullanarak Oracle başlangıç parametrelerinde yapılacak değişiklikler ile SQL komutlarında meydana gelecek değişimlerin “önceki” ve “sonraki” kıyaslama simülasyonunu adım adım yapılandıracağız.

Tarih : 20 Ağustos 2011 Cumartesi 16:09 Yayınlayan: Ugur INAL

Yorumlar

 

Hakan UZUNER

Eline sağlık abi, her zamanki gibi çok kaliteli ve benzersiz bir makale olmuş.

Ağustos 20, 2011 16:24
 

Mehmet AKSU

Çok güzel bir makale olmuş ellerinize sağlık.

Ağustos 24, 2011 11:04
 

Orhan AKDOĞAN

ellerinize sağlık

Ağustos 25, 2011 22:17
Kimliksiz yorumlar seçilemez kılınmış durumdadır.

Yazar: Ugur INAL

http://uguroracle.blogspot.com

Bu Kategori

Hızlı aktarma