İ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