1

次の 2 つのクエリは同じ情報を返します。ただし、最初の処理には 1.1 秒、2 番目の処理には 0.06 秒かかります。

このテーブルには198,810 のレコードがあり、"Contacts"."ReqID"インデックスが付けられています。

  1. (一見) 単純なクエリでこのようなパフォーマンス ヒットが見られるのはなぜですか?
  2. 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 個のレコードが返されます。

4

1 に答える 1

1

Navicat (データベースへのアクセスと管理に使用するソフトウェア) は、単純なSELECT * FROM [Table]ステートメントの実行時にデータをその場で編集できるようにする追加のコードを実行していることがわかりました。以下は、サポート担当者から受け取ったメールです。


[Navicat ユーザー] 様

メールありがとう。列情報を取得し、後でデータを更新できるようにするために、クエリが単純な SELECT クエリの場合、Navicat は追加の SQL を実行することに注意してください。UNION を使用すると、Navicat はユーザーがクエリ結果のデータを更新することを許可しません。

...

敬具
Mayho Ho
Navicat サポート センター

于 2012-12-24T18:44:49.497 に答える