我们有一个查询,其中包括(但有其他联接、表和 where 条件):
SELECT
o.contact_id,
o.completed_date,
o.submitted_date
FROM
orders o /* 860,000 row table */
WHERE
? <= o.submitted_date
AND o.submitted_date < ? + 1
从 Java 应用程序调用。
?
参数允许检查两个日期之间提交的订单。
但是,此查询运行非常缓慢。
我们转换为从 PL/SQL 运行进行测试,如下所示:
SubmittedDateFrom date:=to_date('2011-07-15', 'yyyy-mm-dd');
SubmittedDateTo date:=to_date('2011-07-15', 'yyyy-mm-dd');
CURSOR c_orgs IS
SELECT
o.contact_id,
o.completed_date,
o.submitted_date
FROM
orders o
WHERE
SubmittedDateFrom <= o.submitted_date
AND o.submitted_date < SubmittedDateTo + 1;
BEGIN
FOR c_o IN c_orgs LOOP
DBMS_OUTPUT.put_line('Submitted date = '||c_o.submitted_date);
END LOOP;
END;
如果我们:
- 将
SubmittedDateTo
值转换为to_date('2011-07-16', 'yyyy-mm-dd')
(即在查询之外进行算术运算), - 创建
SubmittedDateTo
一个字符串并使用“to_date('SubmittedDateTo', 'yyyy-mm-dd')
+1”作为WHERE
.
然后,查询速度显着加快(< 1 秒 vs. 44+ 秒)。
更多的信息:
- 在查询上运行解释计划会给出错误
ORA-00932: inconsistent datatypes: expected DATE got NUMBER
- 该
submitted_date
列具有索引和统计信息等已运行 SubmittedDateTo + 1
在通话中包装trunc()
不会影响性能- 我们没有类似数据量的非9i数据库等来测试它是否是Oracle的版本。
问题是:我们找不到任何明确说明 Oracle 9i 优化器在这种日期算法方面存在问题的信息。这是这里发生的事情还是发生了其他事情?