关于Oracle性能(多选+;单计数()与单选+;多计数()比较)

关于Oracle性能(多选+;单计数()与单选+;多计数()比较),oracle,count,multi-select,date-conversion,to-char,Oracle,Count,Multi Select,Date Conversion,To Char,哪种方式(仅在速度方面)更好 单选(多计数(),多到字符()) 编辑 多选(单计数(),单到字符()) 我用小分贝测试过,差别很小,所以我不能决定哪一个是最好的。 大型数据库(可能是巨型数据库)如何?Oracle optimizer将第三个查询转换为等于第二个查询(子查询视图合并转换),因此默认情况下它们的计划相同 第一个更好:having将作为groupby操作的过滤器执行。如果你比较执行计划,你会看到不同之处 我建议使用trunc(rg_date)而不是使用正确的nls_date格式的to_

哪种方式(仅在速度方面)更好

  • 单选(多计数(),多到字符())
  • 编辑

  • 多选(单计数(),单到字符())
  • 我用小分贝测试过,差别很小,所以我不能决定哪一个是最好的。
    大型数据库(可能是巨型数据库)如何?

    Oracle optimizer将第三个查询转换为等于第二个查询(子查询视图合并转换),因此默认情况下它们的计划相同

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


    我建议使用
    trunc(rg_date)
    而不是使用正确的nls_date格式的to_char。

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

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


    我建议使用
    trunc(rg_date)
    而不是使用正确的nls_date格式的to_char。

    谢谢您的回复。正如您所看到的,
    拥有
    的条件是
    >0
    ,这是可以忽略的(即使
    访问
    的概率为零,这也是非常小的)。函数
    COUNT()
    TO_CHAR()
    (也是
    TRUNC()
    )在
    SELECT,WHERE,GROUP BY中重复,具有
    子句。正因为如此,我认为第一个不是最好的方式。我错了吗。如果uuid可为空,则不能忽略having条件,否则它将不等于原始查询。2.无论是在select list和group by中指定函数,还是在内部子查询(将合并/取消列出)中指定函数。查看平面图的投影列
    。它们显示oracle计算它们的步骤。我明白了。还有一个问题,我看到像
    COUNT()
    这样的函数在计划的结果中重复执行。对于
    COUNT()
    结果,需要很长时间(复杂性为
    O(N)
    ),不是吗?重复的功能可以忽略吗?对不起,我打扰了你。我想我必须越来越多地了解甲骨文的计划。感谢you@codingmonster没问题,我喜欢喜欢喜欢了解更多信息的人:)Oracle CBO是一个功能最强大的数据库优化器,具有许多非常酷的功能!我建议读一下乔纳森·刘易斯的《国会预算办公室基础》。这是甲骨文专家的必读书目。谢谢您的回复。正如您所看到的,
    拥有
    的条件是
    >0
    ,这是可以忽略的(即使
    访问
    的概率为零,这也是非常小的)。函数
    COUNT()
    TO_CHAR()
    (也是
    TRUNC()
    )在
    SELECT,WHERE,GROUP BY中重复,具有
    子句。正因为如此,我认为第一个不是最好的方式。我错了吗。如果uuid可为空,则不能忽略having条件,否则它将不等于原始查询。2.无论是在select list和group by中指定函数,还是在内部子查询(将合并/取消列出)中指定函数。查看平面图的投影列
    。它们显示oracle计算它们的步骤。我明白了。还有一个问题,我看到像
    COUNT()
    这样的函数在计划的结果中重复执行。对于
    COUNT()
    结果,需要很长时间(复杂性为
    O(N)
    ),不是吗?重复的功能可以忽略吗?对不起,我打扰了你。我想我必须越来越多地了解甲骨文的计划。感谢you@codingmonster没问题,我喜欢喜欢喜欢了解更多信息的人:)Oracle CBO是一个功能最强大的数据库优化器,具有许多非常酷的功能!我建议读一下乔纳森·刘易斯的《国会预算办公室基础》。这是甲骨文专家的必读书目。
    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
    
    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
    
    
    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