【问题标题】:Use Oracle Analytic functions to speed up a COUNT DISTINCT使用 Oracle 分析函数加速 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,但提取仍然需要很多时间。

标签: sql oracle function


【解决方案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);

【讨论】:

    猜你喜欢
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 2013-09-28
    • 2011-12-17
    • 2010-12-04
    • 2015-01-10
    相关资源
    最近更新 更多