2012-04-27 23 views
1

このクエリは、正確には1693秒の長い時間がかかります。Julianの日付列でこのSELECTクエリを最適化する

SELECT MAX(cov_julian(t.tatime)) 
    FROM Table1 t,Table2 a,Table3 c 
WHERE (t.PERSONID = a.EMPID or t.PERSONID2 = c.Col5) 
    AND cov_julian(tatime) <=sysdate 

cov_julianは、ジュリアン日付を日付に変換するユーザー定義関数です。

このクエリを最適化するにはどうすればよいですか?助けてください。

+1

クエリプランとは何ですか?各テーブルの行数 –

答えて

1

あなたのSELECT句によれば、あなたが実際に気にしている唯一の列はtatimeです。

tatimeTable1の列がある場合は、私が存在するかどうかを確認し、Table2またはTable3に参加しないでしょう。 Ollie第の提案と合わせて

、クエリが

SELECT MAX(cov_julian(t.tatime)) 
FROM table1 t 
WHERE t.tatime <= TO_NUMBER(TO_CHAR(SYSDATE,'J')) 
AND (EXISTS (SELECT NULL 
       FROM table2  a 
       WHERE a.empid = t.personid) 
    OR EXISTS (SELECT NULL 
       FROM table3  c 
       WHERE c.col5 = t.personid2)) 
; 
+0

ありがとうTebbe and Ollie – Ram

4

tatimeにインデックスがある場合は、sysdateをjulianに変換し、直接tatimeと比較してください。

SELECT MAX(cov_julian(t.tatime)) 
    FROM Table1 t,Table2 a,Table3 c 
WHERE (t.PERSONID = a.EMPID or t.PERSONID2 = c.Col5) 
    AND tatime <= to_number(to_char(sysdate,'J')); 

ない場合、あなたはcov_julian(tatime)にファンクション索引を作成し、このクエリを発行する必要があります。

+0

2番目のオプションを使用すると、cov_julian関数を確定的関数に変換する必要がありますか? – Ram

+0

はい@Ram – Ollie

+0

to_number(to_char(sysdate、 'J'))を使用してsysdateをjulianに変換しようとしましたが、コストが上がっただけです。私は、cov_julian(tatime)関数の索引付けを試みます。 – Ram

1

はUDFが呼び出された回数を最小限になりました。これはtatime値が正常MAXで比較することができることを前提としています

SELECT COV_JULIAN(MAX_TIME) FROM 
    (SELECT MAX(t.tatime) AS MAX_TIME 
    FROM Table1 t, 
      Table2 a, 
      Table3 c 
    WHERE (t.PERSONID = a.EMPID or t.PERSONID2 = c.Col5) 
      AND tatime <= TO_NUMBER(TO_CHAR(sysdate, 'J'))) x 
のSQL文からコール

PL/SQL関数は悪いニュースであり、あなたは彼らが呼ばているの回数を最小限に抑えることができる絶対に全力を尽くすしたいです。より新しいバージョン(10g +)は古いバージョンよりも「良い」と思われますが、まだあなたはとなります。実際にははできるだけこれをやりたくありません。

共有して楽しんでください。

関連する問題