下面的这个查询需要很长时间,确切地说是 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
是将儒略日期转换为日期的用户定义函数。
如何优化此查询?请帮忙。
如果有索引,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)
.
根据您的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))
;
尽量减少调用 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+)应该比旧版本“更好”,但仍然 - 你真的想尽可能少地这样做。
分享和享受。