oracle - 关于 Oracle 性能(Multi-SELECT + Single COUNT() vs Single-SELECT + Multi COUNT() )
问题描述
哪种方式更好(仅用于速度)?
- 单 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
- 双 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
- 多选择(单 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
我已经在小型数据库中对此进行了测试,差异非常小,所以我无法确定哪个是最好的。大型(也许是巨大的)数据库怎么样?
解决方案
Oracle 优化器会将第三个查询转换为等于第二个(子查询视图合并转换),因此默认情况下它们将具有相等的计划。
第一个更好:having
将作为操作过滤器group-by
执行。如果您比较执行计划,您会发现差异。
我建议使用trunc(rg_date)
正确的 nls_date_format 代替 to_char。
推荐阅读
- python - 使用列中的信息(键)更改 Pandas 中的索引名称
- python - 烧瓶 url_for 在 docker/docker-compose 下没有组成正确的 url
- symfony - 处理多级角色
- javascript - 如何防止移动设备上的 YouTube IFrame JavaScript API 自动全屏?
- javascript - 单击页面上的其他任何内容后,应列出编辑按钮输入
- hibernate - 更新多对多映射时访问字段时出错
- python - 未能在psychopy中附加变量
- latex - tikzpicture - 将堆积条形图与 y 轴对齐,ymin=0
- android - 使用 RecyclerView、android jetpack 导航和折叠工具栏实现正确滚动
- python - 集合中的 CVXPY 等式约束