EXPLAIN(7)

İSİM
EXPLAIN - bir cümlenin icra planını gösterir

KULLANIM
EXPLAIN [ ANALYZE ] [ VERBOSE ] cümle

AÇIKLAMA
Bu komut, belirtilen cümle için PostgreSQL planlamacısının ürettiği icra planını gösterir. İcra planı cümle tarafından tablolara nasıl başvurulduğunu gösterir. Bu işlem, düz sıralı tarama, indeksli tarama, v.s. şeklinde yapılır. Ayrıca, eğer çok sayıda tabloya başvuruluyorsa, her tablodan gerekli satırların birarada alınması için kullanılacak katılım algoritmasını da gösterir.

Çıktının en önemli parçası, cümlenin icrasının ne kadar süreceği ile ilgili planlamacının tahminde bulunmasıyla saptanan, tahmini cümle icra maliyetidir (disk sayfası cinsinden ölçülür). Aslında, iki sayı gösterilir: başlangıçtan ilk satır döndürülene kadar geçen süre ve tüm satırlar döndürülünceye kadar geçecek toplam süre. Çoğu sorgu için, toplam süre sorun değildir, ama EXISTS'li bir alt sorgunun varlığı gibi durumlarda planlamacı en küçük toplam süreye değil en küçük başlangıç zamanına bakacaktır (icracı bir satır döndüğünde duracaktır). Ancak, döndürülecek satır sayısını LIMIT deyimi ile sınırlarsanız, planlamacı en ucuz planlama için bir tahminde bulunabilecektir.

ANALYZE seçeneği cümlenin planlamasının yapılmasından başka cümlenin çalıştırılmasını da sağlar. Harcanan toplam süre her planlama düğümü için ayrı ayrı gösterilir (milisaniye cinsinden). Ayrıca, dönen satır sayısı da çıktıya eklenir. Bu, planlamacının tahminlerinin tutarlı olup olmadığını görme açısından da yararlıdır.

Önemli:
    ANALYZE kullanıldığında cümlenin çalıştırılacağını unutmayın. EXPLAIN'de kullanıldığında, bir SELECT cümlesinin döndüreceği çıktı iptal edileceğinden, cümlenin bazı yan etkileri varsa, onları bilemeyeceksiniz. INSERT, UPDATE, DELETE veya EXECUTE cümleleri üzerinde EXPLAIN ANALYZE kullanmak ve komutun etkilerinin verinizi etkilememesini isterseniz, şu yaklaşımı kullanabilirsiniz:

        BEGIN;
        EXPLAIN ANALYZE ...;
        ROLLBACK;

PARAMETRELER
ANALYZE
    Cümleyi çalıştırır ve gerçek çalışma sürelerini gösterir.

VERBOSE
    Planlama ağacının bir özetini değil dahili gösteriminin tamamını gösterir. Aslında, bu seçenek sadece hata ayıklama amacıyla yararlıdır. VERBOSE çıktısı explain_pretty_print yapılandırma değişkeninin değerine bağlı olarak ya cicili bicilidir ya da değildir.

cümle
    İcra planını görmek istediğiniz bir SELECT, INSERT, UPDATE, DELETE, EXECUTE veya DECLARE cümlesi.

EK BİLGİ
Eniyileyici kullanımı hakkında
http://www.postgresql.org/docs/8.0/static/performance-tips.html#USING-EXPLAIN adresinde daha fazla bilgi bulabilirsiniz.

PostgreSQL'in sorguları eniyilerken kabul edilebilir kararlar verebilmesi için, ANALYZE komutunun tablo içindeki verilerin istatistiksel dağılımını kaydetmiş olması gerekir. Bu yapılmazsa (ya da tablo içindeki verilerin istatistiksel dağılımı son ANALYZE çağrısından sonra çok fazla değişikliğe uğramışsa), tahmini maliyetler sorgunun gerçek özellikleriyle uyumlu olmayacağı gibi planlamacının ürkütücü bir sorgu planlaması seçimi yapmasına sebep olabilir.

PostgreSQL 7.3 öncesi, sorgu planı bir NOTICE çıktısı biçimindeydi. Şimdi, bir sorgunun sonucu gibi (tek sütunluk bir tablo gösterimi olarak) çıktılanmaktadır.

ÖRNEKLER
integer türünde tek bir sütunu olan 10000 satırlık bir tabloya uygulanan basit bir sorgunun planlamasını görmek için:

EXPLAIN SELECT * FROM foo;

                       QUERY PLAN
---------------------------------------------------------
 Seq Scan on foo  (cost=0.00..155.00 rows=10000 width=4)
(1 row)

Eğer bir indeks varsa ve WHERE ile indekslenen bir sorgu kullanırsak, EXPLAIN farklı bir plan gösterebilir:

EXPLAIN SELECT * FROM foo WHERE i = 4;

                         QUERY PLAN
--------------------------------------------------------------
 Index Scan using fi on foo  (cost=0.00..5.98 rows=1 width=4)
   Index Cond: (i = 4)
(2 rows)

Bir ortak değer işlevi kullanılan bir sorgunun sorgu planı:

EXPLAIN SELECT sum(i) FROM foo WHERE i < 10;

                             QUERY PLAN
---------------------------------------------------------------------
 Aggregate  (cost=23.93..23.93 rows=1 width=4)
   ->  Index Scan using fi on foo  (cost=0.00..23.92 rows=6 width=4)
         Index Cond: (i < 10)
(3 rows)

Bir taslak sorgu hazırlarken bunun icra planını görmek için, EXPLAIN EXECUTE kullanımı örneği:

PREPARE query(int, int) AS SELECT sum(bar) FROM test
    WHERE id > $1 AND id < $2
    GROUP BY foo;

EXPLAIN ANALYZE EXECUTE query(100, 200);

                QUERY PLAN
----------------------------------------------------------
HashAggregate  (cost=39.53..39.53 rows=1 width=8)
                (actual time=0.661..0.672 rows=7 loops=1)
  ->  Index Scan using test_pkey on test
                (cost=0.00..32.97 rows=1311 width=8)
                (actual time=0.050..0.395 rows=99 loops=1)
        Index Cond: ((id > $1) AND (id < $2))
Total runtime: 0.851 ms
(4 rows)

Şüphesiz burada gösterilen değerler işlenen tabloların gerçek içeriğine bağlıdır. Ayrıca, bu değerler ve hatta seçilen sorgu stratejisi, planlamacının sürekli geliştirilmesi sebebiyle, PostgreSQL dağıtımları arasında bile değişiklik gösterebilir. Buna ek olarak, ANALYZE komutu veri istatistiklerini tahmin etmek için rasgele örnekleme yapar; bundan dolayı, tablo verisinde bir değişiklik olmamış bile olsa, taze bir ANALYZE çağrısından sonra maliyet tahminleri değişiklik gösterebilir.

UYUMLULUK
SQL standardında EXPLAIN diye bir deyim yoktur.

İLGİLİ BELGELER
ANALYZE [analyze(7)].

ÇEVİREN
Nilgün Belma Bugüner <nilgun (at) belgeler·gen·tr>, Nisan 2005