我想数一数某机构在某段时间内发出的命令数目。但是,我发现下面的查询(时间范围为2天)比每次执行两个单独的查询一天要慢得多。
SELECT COUNT(*) FROM ORDER_HISTORY
WHERE organization = 'BA' AND TIMESTAMP > = TO_DATE('2016-01-05', 'YYYY-MM-DD')
AND TIMESTAMP<= TO_DATE('2016-01-05', 'YYYY-MM-DD')+2;我在列timestamps上有一个索引,在organization列上有另一个索引

这是我的表的架构。列timestamp的类型为DATE。

2天以上的查询执行计划使用organization上的索引:

1天以上的查询执行计划使用timestamp上的索引:

有一些统计数据:
SELECT COUNT(*) FROM ORDER_HISTORY
WHERE ORGANIZATION = 'BA' ;给了2359847。
SELECT COUNT(*) FROM ORDER_HISTORY
WHERE TIMESTAMP > = TO_DATE('2016-01-05', 'YYYY-MM-DD')
AND TIMESTAMP<= TO_DATE('2016-01-05', 'YYYY-MM-DD')+1;给9260。相同的查询在两天内得到16510。
为什么我会得到甲骨文DB引擎的奇怪行为呢?
发布于 2018-02-15 17:10:47
原因是基于成本的优化器在内存中有一个来自先前选择的计划,其中给定组织的记录数量(即'LOL‘)要小得多,大约为14000。当计划在内存中时,CBO不再关心参数值。使用:
WHERE organization || '' = 'BA'https://dba.stackexchange.com/questions/198028
复制相似问题