我正在尝试从拥有 1.94 亿条记录的表中获取记录计数。使用并行提示和索引快速扫描,但仍然很慢。请针对所附查询提出任何替代方案或改进想法。
SELECT
/*+ parallel(cs_salestransaction 8)
index_ffs(cs_salestransaction CS_SALESTRANSACTION_COMPDATE)
index_ffs(cs_salestransaction CS_SALESTRANSACTION_AK1) */
COUNT(1)
FROM cs_salestransaction
WHERE processingunitseq=38280596832649217
AND (compensationdate BETWEEN DATE '28-06-17' AND DATE '26-01-18'
OR eventtypeseq IN (16607023626823731, 16607023626823732, 16607023626823733, 16607023626823734));
这是执行计划:
[ ]
查询给出了结果,但花了 2 个小时才计算出 1.94 亿。
编辑:
编辑代码以根据 Littlefoot 的建议添加日期。 使用实际列名称编辑的代码。 我是堆栈溢出的新手,因此附上了计划作为图像。
最佳答案
此外,如果 compensationdate
是 DATE
数据类型,请勿将其与字符串进行比较(因为 '28-JUL-17 '
是一个字符串)并强制 Oracle 执行隐式转换并花费时间什么都没有。切换至
compensationdate BETWEEN date '2017-07-28' and date '2018-01-26'
关于sql - 即使使用并行(8)提示,具有百万条记录的表中的计数(1)也很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58387920/