使用 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的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE分析函数

oracle分析函数汇总

ORACLE中count()统计函数的使用

使用oracle中的count函数显示未注册课程的学生

Oracle运维案例之反序函数索引的使用

Oracle 中count count(*) 和count(列名) 函数的区别