PostgreSQL sorgularını explain analyze ile incelemek

Gülçin Yıldırım Jelínek —  24 Şubat 2014 — 1 Comment

Bir sorgu optimizasyonu yaparken sorgunun nasıl planlandığını incelemek önemlidir.

Eğer sorgu çalıştırmak için pgAdmin aracını kullanıyorsanız, pgAdmin arayüzünde üst menüdeki explain explainanalyze butonuna  tıklayabilirsiniz.

Ya da sorguyu psql ile veya yine pgAdmin’in sorgu panelinde şöyle çalıştırabilirsiniz:

Explain select * from table_a;
Explain analyze select * from table_a;

Yukarıdaki gibi explain ve explain analyze sorguları çalıştırıldığında farklı sorgu planları dönerler.

Explain ile olan sorgunun planı:

                            QUERY PLAN
------------------------------------------------------------------
 Seq Scan on table_a (cost=0.00..4740.30 rows=86430 width=140)
(1 row)

Explain analyze ile olan sorgunun planı:

                                                   QUERY PLAN
-----------------------------------------------------------------------------------------------------------------
 Seq Scan on table_a  (cost=0.00..4740.30 rows=86430 width=140) (actual time=0.274..35.983 rows=86430 loops=1)
 Total runtime: 40.492 ms
(2 rows)

Sorgu çalışma planları çıktısından da görülebileceği üzere explain analyze bize daha çok bilgi verip, yönlendiriyor. Bunun sebebi de explain komutunun sadece sorguyu planlamasından, explain analyze komutunun ise sorguyu çalıştırıp planlanmasından kaynaklanır. Bu yüzden çıktısı bizi daha sağlıklı bir sonuca götürür.

Explain analyze işlemini ‘insert’, ‘update’, ‘delete’, ‘create table as’ gibi komutlarda çalıştırırken verilerinizin etkilenmemesi için şu şekilde rollback yapabilirsiniz:

Begin;
Explain analyze delete from table_a; 
Rollback;

Explain komutuna parametreler vererek farklı veri tiplerinde sonuç bastırabilirsiniz. Örneğin JSON veri tipi için deneyelim:

Explain (format JSON) select * from table_a;

Çıktı şu şekilde olur:

             QUERY PLAN
-------------------------------------
 [                                  +
   {                                +
     "Plan": {                      +
       "Node Type": "Seq Scan",     +
       "Relation Name": "table_a",  +
       "Alias": "table_a",          +
       "Startup Cost": 0.00,        +
       "Total Cost": 4740.30,       +
       "Plan Rows": 86430,          +
       "Plan Width": 140            +
     }                              +
   }                                +
 ]

Format parametresi ile TEXT, XML, JSON, YAML veri tiplerinde sonuç bastırabilirsiniz. Çeşitli diğer parametreler ile istediğiniz sonucu daha iyi alabilirsiniz.

Eğer sorgunuz biraz karmaşıksa, bu şekilde çıktı almak yine de yorumlamak için çok kolay olmayacaktır. Bu sebeple explain analyze sonuçlarınızı depesz sitesine yapıştırıp farklı grafikler ile daha iyi yorumlayabilirsiniz. Sitede sunulan çeşitli seçenekler ile sonucu anlamlandırmanız biraz daha kolay olacaktır. Help kısmında bu seçeneklerin neler olduğu güzelce özetlenmiştir, inceleyebilirsiniz.

Kendi yazdığınız sorguları çalıştırmadan önce explain analyze yapmanızı ve yazım stili değiştiğinde planınızın nasıl değiştiğini incelemenizi öneririm.

Kaynak: PostgreSQL Explain

Gülçin Yıldırım Jelínek

Posts Twitter

Gülçin annelik için verdiği araya Thales şirketinde Devops ve Otomasyon Mühendisi olarak iş bulup bir son verdi. Son 10 yıldır PostgreSQL, yazılım otomasyonu ve bulut mimarileri üzerine çalışıyor. Tallinn Teknik Üniversitesi'nde Bilgisayar ve Sistem Mühendisliği üzerine yüksek lisans yaptı ve Yıldız Teknik Üniversitesi Matematik Mühendisliği lisans mezunu. PostgreSQL Europe yönetim kurulunda bulundu ve hala toplulukta konuşmalar yaparak ve konferanslar organize ederek aktif olarak çalışmakta. Şu an Prag'da yaşıyor ve Prague PostgreSQL Meetup'ı organize ediyor. Kadın Yazılımcı kurucu üyelerinden biri olmaktan gurur duyuyor.

One response to PostgreSQL sorgularını explain analyze ile incelemek

  1. Altını çizmek gereken noktalardan bir tanesi şu:

    EXPLAIN, sadece “execution plan” çıkartırken, EXPLAIN ANALYZE o sorguyu gerçekten çalıştırır. Buna da gayet güzel değinmişsin:

    Begin;
    Explain analyze delete from table_a;
    Rollback;

    Bu, beni düşünmeye itti. DELETE, INSERT falan tamam da, ya DDL durumunda ne olur? Yani CREATE TABLE, DROP TABLE yaparsak transaction içinde, o zaman ne olur? Daha önce denediğim bir şey değil. Ama, bilmemek değil, öğrenmemek ayıp. Aradım, cevabı bulması çok da zor olmadı. Cevap şöyle:

    Postgresql, tasarım gereği, DDL komutları dahil, canavar gibi “transactional” davranmayı bilir! Yani, şunu yapabilirsiniz:

    BEGIN;
    DROP TABLE users;
    ROLLBACK;

    Ucuz bir operasyon olmayabilir, ama tablo geri geliyormuş gerçekten. (Ben olsam denemeden önce gene bir backup alırım, ne demişler, paranoyak olan günün sonunda ayakta kalandır…)

    Dolayısıyla, hani şunu da yapsanız bir şey olmaz:

    BEGIN;
    EXPLAIN ANALYZE DROP TABLE users;
    ROLLBACK;

    Kolon ekleme, çıkarma gibi işler de “rollback” edilebiliyor doğal olarak.

    Bunları sakın ola MySQL’de denemeyin!!!

    … çünkü Postgresql çok güzel, MySQL’de de genel olarak DDL, transactional değil!

Yorum yapmak için