1

以下のこのクエリは、正確には1693秒の長い時間がかかります。

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ユリウス日を日付に変換するユーザー定義関数です。

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

4

3 に答える 3

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)ます。

于 2012-04-27T18:46:35.027 に答える
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 +)は、古いバージョンよりも「優れている」と思われますが、それでも、これはできるだけ少なくしたいと考えています

共有してお楽しみください。

于 2012-04-28T00:46:04.933 に答える
1

あなたの条項によると、SELECTここで本当に気になる列は。だけですtatime

tatimeがの列である場合、またはTable1に参加せずに存在するかどうかを確認します。Table2Table3

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))
;
于 2012-04-27T20:04:31.143 に答える