【发布时间】:2011-08-08 14:30:03
【问题描述】:
我们有一个查询,其中包括(但还有其他联接、表和 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中的第二个条件。
那么,查询速度显着加快(
更多信息:
- 对查询运行解释计划会出现错误
ORA-00932: inconsistent datatypes: expected DATE got NUMBER -
submitted_date列有索引和统计信息等已运行 - 将
SubmittedDateTo + 1包装在trunc()调用中不会影响性能 - 我们没有类似数据量等的非9i数据库来测试它是否是Oracle的版本。
问题是:我们找不到任何明确说明 Oracle 9i 优化器在这种日期算法方面存在问题的信息。这是这里发生的事情还是发生了其他事情?
【问题讨论】:
-
您是否能够通过测试用例(例如,从 dba_objects 等构建的表)复制问题。
-
没试过。我的 DB 权限有限,因为我在 app-dev 而不是 dba 方面......
-
您的 Java 代码是否将 DATE 或 STRING 绑定到 ?
-
我们绑定到 ?带有
java.sql.Timestamp对象。请参阅 Ollie 的问题,了解真正的问题是什么。
标签: performance oracle oracle9i ora-00932