关于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