我正在尝试从具有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的建议添加DATE。使用实际列名编辑的代码。我是堆栈溢出的新手,因此已将计划作为映像进行了附加。
另外,如果compensationdate
是DATE
数据类型,请不要将其与字符串(因为'28-JUL-17'
是字符串)进行比较,并强制Oracle执行隐式转换并花费时间在空上。切换到
compensationdate BETWEEN date '2017-07-28' and date '2018-01-26'