MySQL の Explain 出力は非常に単純です。PostgreSQL はもう少し複雑です。それを説明する適切なリソースも見つかりませんでした。
説明が何を言っているのか正確に説明できますか、または少なくとも良いリソースの方向性を教えてもらえますか?
MySQL の Explain 出力は非常に単純です。PostgreSQL はもう少し複雑です。それを説明する適切なリソースも見つかりませんでした。
説明が何を言っているのか正確に説明できますか、または少なくとも良いリソースの方向性を教えてもらえますか?
Explaining_EXPLAIN.pdfも役立ちます。
それは、最もインデントの少ないものから最もインデントの少ないものまで実行されます。私は、計画の最下部から最上位までを信じています。(したがって、インデントされたセクションが 2 つある場合、ページの下の方にあるセクションが最初に実行され、次にそれらが他のセクションに出会うと、それらを結合するルールが実行されます。)
各ステップで、1 つまたは 2 つのデータセットが到着し、何らかのルールによって処理されるという考え方です。データセットが 1 つだけの場合、その操作はそのデータセットに対して行われます。(たとえば、インデックスをスキャンして必要な行を見つけたり、データセットをフィルター処理したり、並べ替えたりします。) 2 の場合、2 つのデータセットはさらにインデントされた 2 つのものであり、表示される規則によって結合されます。ほとんどのルールの意味はかなり簡単に推測できますが (特に、以前に説明計画をたくさん読んだことがある場合)、ドキュメントを参照するか、(より簡単に) フレーズを単にのようないくつかのキーワードと一緒にグーグルEXPLAIN
。
これは明らかに完全な説明ではありませんが、通常は必要なものを理解できる十分なコンテキストを提供します。たとえば、実際のデータベースからの次の計画を検討してください。
explain analyze
select a.attributeid, a.attributevalue, b.productid
from orderitemattribute a, orderitem b
where a.orderid = b.orderid
and a.attributeid = 'display-album'
and b.productid = 'ModernBook';
------------------------------------------------------------------------------------------------------------------------------------------------------------
Merge Join (cost=125379.14..125775.12 rows=3311 width=29) (actual time=841.478..841.478 rows=0 loops=1)
Merge Cond: (a.orderid = b.orderid)
-> Sort (cost=109737.32..109881.89 rows=57828 width=23) (actual time=736.163..774.475 rows=16815 loops=1)
Sort Key: a.orderid
Sort Method: quicksort Memory: 1695kB
-> Bitmap Heap Scan on orderitemattribute a (cost=1286.88..105163.27 rows=57828 width=23) (actual time=41.536..612.731 rows=16815 loops=1)
Recheck Cond: ((attributeid)::text = 'display-album'::text)
-> Bitmap Index Scan on (cost=0.00..1272.43 rows=57828 width=0) (actual time=25.033..25.033 rows=16815 loops=1)
Index Cond: ((attributeid)::text = 'display-album'::text)
-> Sort (cost=15641.81..15678.73 rows=14769 width=14) (actual time=14.471..16.898 rows=1109 loops=1)
Sort Key: b.orderid
Sort Method: quicksort Memory: 76kB
-> Bitmap Heap Scan on orderitem b (cost=310.96..14619.03 rows=14769 width=14) (actual time=1.865..8.480 rows=1114 loops=1)
Recheck Cond: ((productid)::text = 'ModernBook'::text)
-> Bitmap Index Scan on id_orderitem_productid (cost=0.00..307.27 rows=14769 width=0) (actual time=1.431..1.431 rows=1114 loops=1)
Index Cond: ((productid)::text = 'ModernBook'::text)
Total runtime: 842.134 ms
(17 rows)
自分で読んでみて、意味があるかどうかを確認してください。
私が読んだことは、データベースが最初にid_orderitem_productid
インデックスをスキャンし、それを使用して必要な行を見つけorderitem
、次にクイックソートを使用してそのデータセットをソートし (データが RAM に収まらない場合、使用されるソートは変更されます)、それを脇に置きます。
次に、スキャンorditematt_attributeid_idx
して必要な行を見つけ、orderitemattribute
クイックソートを使用してそのデータセットをソートします。
次に、2 つのデータセットを取得してマージします。(マージ結合は一種の「圧縮」操作であり、並べ替えられた 2 つのデータセットを並行して処理し、一致したときに結合された行を出力します。)
私が言ったように、あなたは計画の内側から外側へ、下から上へと進みます。
PgAdminは、Explain Plan をグラフィカルに表示します。この 2 つを交互に切り替えると、テキスト表現の意味を理解するのに非常に役立ちます。ただし、何をするのか知りたいだけの場合は、いつでも GUI を使用できる場合があります。
PostgreSQLの公式ドキュメントには、explainの出力を理解する方法に関する興味深い徹底的な説明が記載されています。
pgadminをインストールすると、[説明]ボタンが表示され、テキスト出力に何が起こっているのかを示す図が表示され、何が起こっているのかを確認するのに非常に役立つフィルター、並べ替え、サブセットのマージが表示されます。