【问题标题】:who is faster between without union query and a union query?在没有联合查询和联合查询之间谁更快?
【发布时间】:2020-01-09 23:28:14
【问题描述】:

我已经通过 oracle 创建了一个大的选择查询,我需要使用 UNION 插入 13 种不同的选择查询。我想知道,如果我能够减少 UNION 并通过连接查询创建它们,那么使用 UNION 查询还是不使用 UNION 查询对我来说最好的是什么?

谁给我的数据很快,有 UNION 还是没有 UNION

让我们举个例子来解决我的问题:

  1. 这是一个没有 UNION 查询
SELECT customer_name, SUM (CURRENT_TOTAL) CURRENT_TOTAL
    FROM (SELECT CASE
                    WHEN gc.id = 11 THEN 'GOVT (Defence)'
                    WHEN gc.id <> 11 THEN 'GOVT (Except Defence)'
                 END
                    customer_name,
                 CB.CURRENT_TOTAL
            FROM cust_domestic c
                 JOIN GOVERNMENT_CUSTOMERS gc ON c.code = gc.cust_code
                 JOIN customer_bill cb ON cb.cust_code = c.code)
    GROUP BY customer_name
  1. 这是一个使用 UNION 查询
SELECT 'GOVT (Defence)' customer_name, SUM (CB.CURRENT_TOTAL) CURRENT_TOTAL
  FROM cust_domestic c
       JOIN GOVERNMENT_CUSTOMERS gc ON c.code = gc.cust_code
       JOIN customer_bill cb ON cb.cust_code = c.code
 WHERE gc.id = 11
UNION
SELECT 'GOVT (Defence)' customer_name, SUM (CB.CURRENT_TOTAL) CURRENT_TOTAL
  FROM cust_domestic c
       JOIN GOVERNMENT_CUSTOMERS gc ON c.code = gc.cust_code
       JOIN customer_bill cb ON cb.cust_code = c.code
 WHERE gc.id <> 11

他们都给我以下结果

Customer_name            |    CURRENT_TOTAL
------------------------------------------- 
GOVT (Defence)           |           29020
GOVT (Except Defence)    |      2121974363

现在我的问题是谁给我更好的表现,考虑时间并更快地给我结果?

他们之间谁是更好的查询?

【问题讨论】:

    标签: sql oracle oracle11g query-performance


    【解决方案1】:

    一般来说,您使用的第一个条件聚合方法应该优于联合方法,因为前者只需要对表进行一次扫描。但是,我会在不使用子查询的情况下重写它:

    SELECT
        SUM(CASE WHEN gc.id = 11 THEN CB.CURRENT_TOTAL ELSE 0 END) AS "GOVT (Defence)",
        SUM(CASE WHEN gc.id <> 11 THEN CB.CURRENT_TOTAL ELSE 0 END) AS "GOVT (Except Defence)"
    FROM cust_domestic c
    INNER JOIN GOVERNMENT_CUSTOMERS gc
        ON c.code = gc.cust_code
    INNER JOIN customer_bill cb
        ON cb.cust_code = c.code;
    

    但是,附带说明一下,这种方法实际上将输出作为单个记录提供,其中两个总和的两列,而不是两个记录。

    【讨论】:

    • 其实我需要两条记录而不是两列。
    • 那么您的第一种方法可能仍然是最佳的,因为它只需要一次连接/扫描即可生成总和和标签。联合方法不能很好地扩展,因为您需要为每个标签单独查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2015-07-08
    • 1970-01-01
    • 2011-10-04
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多