使用Julian日期列优化此SELECT查询

时间:2012-04-27 18:42:22

标签: oracle plsql

以下查询需要很长时间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是一个用户定义的函数,可将julian日期转换为日期。

如何优化此查询?请帮忙。

3 个答案:

答案 0 :(得分:4)

如果tatime上有索引,则将sysdate转换为julian并直接与tatime进行比较。

e.g。

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)上创建基于函数的索引。

答案 1 :(得分:1)

根据您的SELECT条款,您真正关心的唯一一栏是tatime

如果tatimeTable1上的一列,那么我会检查是否存在,而不是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))
;

答案 2 :(得分: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 +)应该比旧版本“更好”,但仍然 - 你真的希望尽可能少地做到这一点。

分享并享受。