次の 2 つのクエリは同じ情報を返します。ただし、最初の処理には 1.1 秒、2 番目の処理には 0.06 秒かかります。
このテーブルには198,810 のレコードがあり、"Contacts"."ReqID"
インデックスが付けられています。
- (一見) 単純なクエリでこのようなパフォーマンス ヒットが見られるのはなぜですか?
- UNION サブクエリがプロセスを高速化するのはなぜですか?
*編集*
両方のクエリを立て続けに実行しましたが、パフォーマンスに変化は見られません。
クエリ 1
SELECT
"Contacts"."ContactID",
"Contacts"."ReqID"
FROM
"Contacts"
WHERE
"Contacts"."ReqID" = 2426;
*編集*
説明する 分析する
Index Scan using "Contacts_ReqID_idx" on "Contacts" (cost=0.00..30.08 rows=11 width=78) (actual time=0.076..0.115 rows=14 loops=1)
Index Cond: ("ReqID" = 2426)
Total runtime: 0.159 ms
14 レコードを返すのに1.1 秒。
クエリ 2
SELECT
"T1"."ContactID",
"T1"."ReqID"
FROM
(
SELECT
"Contacts"."ContactID",
"Contacts"."ReqID"
FROM
"Contacts"
WHERE
"Contacts"."ReqID" = 2426
UNION
SELECT
"Contacts"."ContactID",
"Contacts"."ReqID"
FROM
"Contacts"
WHERE
"Contacts"."ReqID" = 2426
) AS "T1"
ORDER BY
"ReqID"
*編集*
説明する 分析する
Sort (cost=61.74..61.80 rows=22 width=100) (actual time=0.313..0.329 rows=14 loops=1)
Sort Key: "Contacts"."ReqID"
Sort Method: quicksort Memory: 26kB
-> HashAggregate (cost=60.81..61.03 rows=22 width=78) (actual time=0.266..0.285 rows=14 loops=1)
-> Append (cost=0.00..60.37 rows=22 width=78) (actual time=0.063..0.201 rows=28 loops=1)
-> Index Scan using "Contacts_ReqID_idx" on "Contacts" (cost=0.00..30.08 rows=11 width=78) (actual time=0.059..0.106 rows=14 loops=1)
Index Cond: ("ReqID" = 2426)
-> Index Scan using "Contacts_ReqID_idx" on "Contacts" (cost=0.00..30.08 rows=11 width=78) (actual time=0.006..0.024 rows=14 loops=1)
Index Cond: ("ReqID" = 2426)
Total runtime: 0.410 ms
0.06 秒で14 個のレコードが返されます。