使用 Oracle 分析函数加速 COUNT DISTINCT
Posted
技术标签:
【中文标题】使用 Oracle 分析函数加速 COUNT DISTINCT【英文标题】:Use Oracle Analytic functions to speed up a COUNT DISTINCT 【发布时间】:2019-01-31 11:22:06 【问题描述】:我必须得到一个查询才能更好地执行:
SELECT COUNT(DISTINCT T.ID)
FROM MY_TABLE T
WHERE T.DATE BETWEEN ADD_MONTHS(TO_DATE('01/12/2018', 'dd/mm/yyyy'), -6) AND
LAST_DAY(TO_DATE('01/12/2018', 'dd/mm/yyyy'));
此查询输出参考日期前 6 个月内该标志的不同出现次数。
我尝试使用 Oracle 分析函数,但没有一个示例在网上找到工作,也没有我得出的结果:
SELECT COUNT(DISTINCT T.ID) OVER(RANGE BETWEEN ADD_MONTHS(TO_DATE('01/12/2018', 'dd/mm/yyyy'), -6) AND LAST_DAY(TO_DATE('01/12/2018', 'dd/mm/yyyy')))
FROM MY_TABLE T;
我是否遗漏了什么,或者我想要完成的事情根本不值得分析函数,或者只是错了?
提前致谢。
【问题讨论】:
您缺少ORDER BY
子句。
分析函数不是为了性能。您可能应该尝试为 date,id 添加索引
我确实有一个日期的 ID,但提取仍然需要很多时间。
【参考方案1】:
您可以尝试使用 GROUP BY。有时,是最快的。如果您在 DATE 字段上没有索引,则可以使用并行选项执行全表扫描。
SELECT COUNT(1) FROM
(SELECT /*+ FULL(T) PARALLEL(T)*/ T.ID
FROM MY_TABLE T
WHERE T.DATE BETWEEN
ADD_MONTHS(TO_DATE('01/12/2018', 'dd/mm/yyyy'), -6)
AND
LAST_DAY(TO_DATE('01/12/2018', 'dd/mm/yyyy'))
GROUP BY T.ID);
【讨论】:
以上是关于使用 Oracle 分析函数加速 COUNT DISTINCT的主要内容,如果未能解决你的问题,请参考以下文章