关于 Oracle 性能Multi-SELECT + Single COUNT() vs Single-SELECT + Multi COUNT()

问题描述

哪种方式更好(仅针对速度)?

  1. 单个 SELECT(多个 COUNT()、多个 TO_CHAR())
SELECT
    T.UUID,TO_CHAR(T.RG_DATE,'YYYY-MM-DD') RG_DATE,COUNT(T.UUID) VISITS
FROM
    ACCOUNT T
GROUP BY
    T.UUID,'YYYY-MM-DD')
HAVING 
    COUNT(T.UUID) > 0

编辑

SELECT
  T.UUID,COUNT(T.UUID) VISITS
FROM
  ACCOUNT T
GROUP BY
  T.UUID,'YYYY-MM-DD')
HAVING 
  COUNT(T.UUID) > 0
  AND COUNT(T.UUID) >= 2       -- Spring mybatis generated code
  AND COUNT(T.UUID) < 5        -- Spring mybatis generated code
  1. 双 SELECT(单 COUNT()、多 TO_CHAR())
SELECT
    T.UUID,T.RG_DATE,T.VISITS
FROM (
    SELECT
        T.UUID,COUNT(T.UUID) VISITS
    FROM
        ACCOUNT T
    GROUP BY
        T.UUID,'YYYY-MM-DD')
    ) T
WHERE
    T.VISITS > 0

  1. 多 SELECT(单 COUNT()、单 TO_CHAR())
SELECT
    T.UUID,COUNT(T.UUID) VISITS
    FROM (
        SELECT
            T.UUID,'YYYY-MM-DD') RG_DATE
        FROM
            ACCOUNT T
        ) T
    GROUP BY
        T.UUID,T.RG_DATE
    ) T
WHERE
    T.VISITS > 0

我已经在小数据库中测试过这个,差异非常小,所以我无法决定哪个是最好的。 大型(可能是巨型)数据库怎么样?

解决方法

Oracle 优化器会将第 3 个查询转换为等于第 2 个(子查询视图合并转换),因此默认情况下它们将具有相同的计划。

第一个更好:having 将作为 group-by 操作的过滤器执行。如果您比较执行计划,您会看到不同之处。

我建议使用 trunc(rg_date) 而不是 to_char 和适当的 nls_date_format。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...