UNION子查询的奇怪行为,为什么?

时间:2012-12-19 15:36:40

标签: sql postgresql navicat

以下两个查询返回相同的信息;但是,第一个需要1.1秒才能完成,第二个需要0.06秒

此表格 198,810条记录,且"Contacts"."ReqID"已编入索引。

  1. 为什么我看到(似乎)不太复杂的查询会影响性能?
  2. 为什么UNION子查询会加快进程?
  3. *的 修改 *

    我已经快速连续运行了两个查询,并且没有看到性能发生变化。


    查询1

    SELECT
        "Contacts"."ContactID",
        "Contacts"."ReqID"
    FROM
        "Contacts"
    WHERE
        "Contacts"."ReqID" = 2426;
    

    *的 修改 *

    EXPLAIN ANALYZE

    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"
    

    *的 修改 *

    EXPLAIN ANALYZE

    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条记录

1 个答案:

答案 0 :(得分:1)

事实证明,Navicat(我用来访问和管理我的数据库的软件)正在运行一些额外的代码,允许在运行简单的SELECT * FROM [Table]语句时对数据进行编辑。以下是我从支持代表处收到的电子邮件。


  

亲爱的[Navicat用户],

     

感谢您的电子邮件。请注意,以获得列   信息并允许随后更新数据,Navicat将额外运行   SQL当查询是一个简单的SELECT查询时。使用UNION,Navicat没有   允许用户更新查询结果中的任何数据。

     

...

     

此致,Mayho Ho
Navicat支持中心