以下を含むクエリがあります (ただし、他の結合、テーブル、および 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 アプリケーションから呼び出されます。
パラメータにより、2 つの?
日付の間に送信された注文を確認できます。
ただし、このクエリの実行は非常に遅くなります。
次のように、テストのために 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')
し、 の 2 番目の条件として "+1" を使用しWHERE
ます。
その後、クエリは劇的に高速化されます (< 1 秒対 44+ 秒)。
さらに詳しい情報:
- クエリで実行計画を実行すると、エラーが発生します
ORA-00932: inconsistent datatypes: expected DATE got NUMBER
- 列にはインデックスがあり、
submitted_date
統計などが実行されています - を呼び出しにラップして
SubmittedDateTo + 1
も、trunc()
パフォーマンスには影響しません - Oracle のバージョンであるかどうかをテストするために、同様のデータ ボリュームなどを備えた 9i 以外のデータベースはありません。
問題は、Oracle 9i Optimizer がこの種の日付計算に問題があることを明確に示す情報を見つけることができないということです。それがここで起こっていることですか、それとも何か他のことが起こっていますか?