13. 実行計画
• 実行計画の確認方法
• コマンドで実行する場合は、DBMSによって異なります。
• このテキストではPostgreSQLで検証しながら学習を進めます。
13
DBMS コマンド
Oracle SET AUTOTRACE TRACEONLY
SQL Server SET SHOWPLAN_TEXT ON
DB2 EXPLAIN ALL WITH SNAPSHOT FOR SQL文
PostgreSQL EXPLAIN SQL文
MySQL EXPLAIN EXTENDED SQL文
14. 実行計画
• 実行計画で使用するテーブル定義
• 今回の検証で使用するのは以下の2つのテーブルです。
• それぞれ10万件ずつのレコードが存在していることを前提とします。
14
tableA インデックス
物理名 型 primary key 1 a_id
a_id integer 〇
name varchar(50)
value real
tableB インデックス
物理名 型 primary key 1 b_id
b_id integer 〇 2 a_id
a_id integer
value real
31. Nested Loops
• まずは以下のSQL文の実行計画を確認します。
• 実行結果は2レコードになるSQL文になっています。
31
axizdb=> EXPLAIN SELECT * FROM tableA a
INNER JOIN tableB b
ON a.a_id = b.a_id
WHERE b.value = 1
AND b.a_id BETWEEN 10 AND 200;
50. 演習問題
• 演習問題
• 以下のSQL文の実行計画を確認してみましょう。
• 実行計画の結果から何が分かるか考察してみましょう。
50
-- ORDER BY ①
SELECT * FROM tableB
WHERE a_id BETWEEN 1 AND 100
ORDER BY b_id;
-- ORDER BY ②
SELECT * FROM tableB
WHERE a_id BETWEEN 1 AND 100
ORDER BY a_id;
-- ORDER BY ③
SELECT * FROM tableB
WHERE a_id BETWEEN 1 AND 100
ORDER BY a_id DESC;
51. 演習問題
• 演習問題
51
-- LIMIT
SELECT * FROM tableB
WHERE a_id BETWEEN 1 AND 100
LIMIT 50;
-- ORDER BY & LIMIT
SELECT * FROM tableB
WHERE a_id BETWEEN 1 AND 100
ORDER BY b_id
LIMIT 50;
52. 演習問題
• 演習問題
52
-- GROUP BY
SELECT value, count(*)
FROM tableB
GROUP BY value;
-- GROUP BY & HAVING
SELECT value, count(*)
FROM tableB
GROUP BY value
HAVING count(*) > 100;
53. 演習問題
• 演習問題
53
-- GROUP BY & ORDER BY
SELECT value FROM tableB
GROUP BY value
ORDER BY value;
-- WHERE & GROUP BY
SELECT value, count(*)
FROM tableB
WHERE b_id < 1000
GROUP BY value;
54. 演習問題
• 演習問題
54
-- EXISTS ①
SELECT * FROM tableA a
WHERE EXISTS (SELECT * FROM tableB
WHERE a_id = a.a_id AND value = 1
AND a_id BETWEEN 1 AND 200);
-- EXISTS ②
SELECT * FROM tableB b
WHERE a_id BETWEEN 1 AND 200
AND value = 1
AND EXISTS (SELECT * FROM tableA
WHERE a_id = b.a_id);
55. 演習問題
• 演習問題
55
-- EXISTS ③
SELECT * FROM tableA a
WHERE EXISTS (SELECT * FROM tableB
WHERE a_id = a.a_id
AND value = 1);
-- EXISTS ④
SELECT * FROM tableB b
WHERE value = 1
AND EXISTS (SELECT * FROM tableA
WHERE a_id = b.a_id);
56. 演習問題
• 演習問題
56
-- INを使ったサブクエリ ①
SELECT * FROM tableA
WHERE a_id in (SELECT a_id FROM tableB
WHERE value = 1
AND a_id BETWEEN 1 AND 200);
-- INを使ったサブクエリ ②
SELECT * FROM tableB b
WHERE a_id BETWEEN 1 AND 200
AND value = 1
AND a_id IN (SELECT a_id FROM tableA);