以下查询需要很长时间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日期转换为日期。
如何优化此查询?请帮忙。
答案 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
。
如果tatime
是Table1
上的一列,那么我会检查是否存在,而不是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))
;
答案 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 +)应该比旧版本“更好”,但仍然 - 你真的希望尽可能少地做到这一点。
分享并享受。