今回は、Goldの「性能監視 - クエリ実行計画」からの出題です。
EXPLAINコマンドを用いて問い合わせを実行させ、結果が出力された。
EXPLAIN ANALYZE SELECT *
FROM table1 t1, table2 t2
WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------
Nested Loop (cost=0.00..352.17 rows=97 width=16) (actual time=0.033..1.875 rows=100 loops=1)
-> Index Scan using table1_i1 on table1 t1 (cost=0.00..24.05 rows=97 width=8) (actual time=0.016..0.218 rows=100 loops=1)
Index Cond: (unique1 < 100)
-> Index Scan using table2_i2 on table2 t2 (cost=0.00..3.27 rows=1 width=8) (actual time=0.004..0.006 rows=1 loops=100)
Index Cond: (t2.unique2 = t1.unique2)
Total runtime: 2.065 ms
この結果言えることとして、誤っているものを2つ選択せよ。
A. この問い合わせにより出力される行数は97行であった。
B. Total runtime には、結果行を操作するための時間の他に、エクゼキュータの起動、停止時間も含まれている。
C. table2_i2 という名前のインデックスを用いて検索をしている。
D. Nested Loop の cost と actual time の値が大きく異なっているので、統計情報の再収集が必要である。
E. table1 が外側、table2 が内側になるネステッドループで結合をしている。
※この例題は実際のOSS-DB技術者認定試験とは異なります。
問い合わせの先頭にEXPLAINを付加することにより、その問い合わせの実行計画を表示することができます。
また、この問題の例のようにANALYZEオプションを付与すると、実際にその問い合わせを実行し、実行時間を表示することができます。
「cost=...」の部分が計画生成時の推測値、「actual time=...」の部分が問い合わせ実行時の実測値です。
ANALYZEオプションを付与することで、「actual time」が表示されます。
以下、選択肢ごとに正誤を確認します。
A. costのカッコ内のrowsは、統計情報を元にした、推定行数です。
実際の行数は、actual timeのカッコ内のrowsになります。
従って、誤りです。
B. Total runtime には、結果行を操作するための時間の他に、エクゼキュータの起動、停止時間も含まれています。
従って、正しいです。
C. QUERY PLAN の中に、「Index Scan using table2_i2 on table2 t2」という表示があり、table2_i2 という名前のインデックスを用いて検索をしています。
従って、正しいです。
D. actual timeの単位はミリ秒ですが、costには単位はありません。
そのため、単純な数字の比較には意味がありません。
従って、誤りです。
E. ネステッドループによる結合は、上に書かれているほうが外側、下に書かれているほうが内側のループになります。
従って、正しいです。
正解は A と D です。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.