1

以下两个查询返回相同的信息;但是,第一个需要 1.1 秒才能完成,第二个需要 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

1.1秒返回14条记录


查询 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 回答