首页 > 解决方案 > 关于 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, TO_CHAR(T.RG_DATE, 'YYYY-MM-DD')
HAVING 
    COUNT(T.UUID) > 0

编辑

SELECT
  T.UUID, TO_CHAR(T.RG_DATE, 'YYYY-MM-DD') RG_DATE, COUNT(T.UUID) VISITS
FROM
  ACCOUNT T
GROUP BY
  T.UUID, TO_CHAR(T.RG_DATE, '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, TO_CHAR(T.RG_DATE, 'YYYY-MM-DD') RG_DATE, COUNT(T.UUID) VISITS
    FROM
        ACCOUNT T
    GROUP BY
        T.UUID, TO_CHAR(T.RG_DATE, 'YYYY-MM-DD')
    ) T
WHERE
    T.VISITS > 0

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

我已经在小型数据库中对此进行了测试,差异非常小,所以我无法确定哪个是最好的。大型(也许是巨大的)数据库怎么样?

标签: oraclecountmulti-selectdate-conversionto-char

解决方案


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

第一个更好:having将作为操作过滤器group-by执行。如果您比较执行计划,您会发现差异。

我建议使用trunc(rg_date)正确的 nls_date_format 代替 to_char。


推荐阅读