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

根据您的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 回答
1

尽量减少调用 UDF 的次数。这假设 MAX 可以成功比较 tatime 值:

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 回答