.\" http://belgeler.org \- 2009\-10\-29T15:35:51+02:00 .TH "EXPLAIN" 7 "" "PostgreSQL" "SQL \- Dil Deyimleri" .nh .PD 0 .SH İSİM EXPLAIN \- bir cümlenin icra planını gösterir .SH KULLANIM .nf \fBEXPLAIN\fR [ \fBANALYZE\fR ] [ \fBVERBOSE\fR ] \fIcümle\fR .fi .SH 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 \fBEXISTS\fR\N'39'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ı \fBLIMIT\fR deyimi ile sınırlarsanız, planlamacı en ucuz planlama için bir tahminde bulunabilecektir. \fBANALYZE\fR 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. .br .ns .TP \fBÖnemli:\fR \fBANALYZE\fR kullanıldığında cümlenin çalıştırılacağını unutmayın. \fBEXPLAIN\fR\N'39'de kullanıldığında, bir \fBSELECT\fR cümlesinin döndüreceği çıktı iptal edileceğinden, cümlenin bazı yan etkileri varsa, onları bilemeyeceksiniz. \fBINSERT\fR, \fBUPDATE\fR, \fBDELETE\fR veya \fBEXECUTE\fR cümleleri üzerinde \fBEXPLAIN ANALYZE\fR kullanmak ve komutun etkilerinin verinizi etkilememesini isterseniz, şu yaklaşımı kullanabilirsiniz: .IP .RS .RS 4 .nf BEGIN; EXPLAIN ANALYZE ...; ROLLBACK; .fi .RE .RE .IP .PP .SH PARAMETRELER .br .ns .TP \fBANALYZE\fR Cümleyi çalıştırır ve gerçek çalışma sürelerini gösterir. .TP \fBVERBOSE\fR 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. \fBVERBOSE\fR çıktısı explain_pretty_print yapılandırma değişkeninin değerine bağlı olarak ya cicili bicilidir ya da değildir. .TP \fIcümle\fR İcra planını görmek istediğiniz bir \fBSELECT\fR, \fBINSERT\fR, \fBUPDATE\fR, \fBDELETE\fR, \fBEXECUTE\fR veya \fBDECLARE\fR cümlesi. .PP .SH EK BİLGİ Eniyileyici kullanımı hakkında .br http://www.postgresql.org/docs/8.0/static/performance\-tips.html#USING\-EXPLAIN adresinde daha fazla bilgi bulabilirsiniz. PostgreSQL\N'39'in sorguları eniyilerken kabul edilebilir kararlar verebilmesi için, \fBANALYZE\fR 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 \fBANALYZE\fR ç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 \fBNOTICE\fR çıktısı biçimindeydi. Şimdi, bir sorgunun sonucu gibi (tek sütunluk bir tablo gösterimi olarak) çıktılanmaktadır. .SH Ö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: .nf EXPLAIN SELECT * FROM foo; \ QUERY PLAN \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \ Seq Scan on foo (cost=0.00..155.00 rows=10000 width=4) (1 row) .fi Eğer bir indeks varsa ve \fBWHERE\fR ile indekslenen bir sorgu kullanırsak, \fBEXPLAIN\fR farklı bir plan gösterebilir: .nf 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) .fi Bir ortak değer işlevi kullanılan bir sorgunun sorgu planı: .nf 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) .fi Bir taslak sorgu hazırlarken bunun icra planını görmek için, \fBEXPLAIN EXECUTE\fR kullanımı örneği: .nf 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) .fi Şü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, \fBANALYZE\fR komutu veri istatistiklerini tahmin etmek için rasgele örnekleme yapar; bundan dolayı, tablo verisinde bir değişiklik olmamış bile olsa, taze bir \fBANALYZE\fR çağrısından sonra maliyet tahminleri değişiklik gösterebilir. .SH UYUMLULUK SQL standardında \fBEXPLAIN\fR diye bir deyim yoktur. .SH İLGİLİ BELGELER \fBANALYZE\fR [analyze(7)]. .SH ÇEVİREN Nilgün Belma Bugüner , Nisan 2005