PostgreSQL sorgularını explain analyze ile incelemek

Gülçin Yıldırım —  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:

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

Explain ile olan sorgunun planı:

Explain analyze ile olan sorgunun planı:

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:

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

Çıktı şu şekilde olur:

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

Posts Twitter Facebook Google+

Yıldız Matematik Mühendisliği bölümünde okudu, algoritmalar ve veri tabanları ile orada tanıştı. PostgreSQL ile karşılaşana dek birçok veri tabanı ile çalıştı ama artık pek tercih etmiyor. Açık kaynak kod ve özgür yazılım seven bir DBA. Çok az şey biliyor ve çok şey öğrenmek istiyor, şu an 2ndQuadrant'ta çalışıyor.

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