我想優化查詢,我在where子句中使用函數()調用。函數調用pl/sql查詢優化where條款
function()只是改變日期的時區。
當我調用該函數作爲SELECT的一部分,它的執行速度極快(< 0.09秒對許多幾十萬行的表)
select
id,
fn_change_timezone (date_time, 'UTC', 'US/Central') AS tz_date_time,
value
from a_table_view
where id = 'keyvalue'
and date_time = to_date('01-10-2014','mm-dd-yyyy')
但是,此版本運行「永遠」 [指我許許多多分鐘]後停止
select id, date_time, value
from a_table_view
where id = 'keyvalue'
and fn_change_timezone (date_time, 'UTC', 'US/Central') = to_date('01-10-2014','mm-dd-yyyy')
(我知道我不得不更改日期進行比較,它只是舉例)
所以我的q題目了有兩方面:
如果該功能是如此之快的where子句之外,爲什麼這麼慢得多使用TRUNC()或其他功能(顯然TRUNC()沒有做一個表查找比說像我的功能 - 但仍然功能是非常非常快速的where子句)
在where子句之外完成此操作的替代方法是什麼?
我想這作爲一種替代,這似乎沒有任何好轉,但仍跑,直到我停止了查詢:
select
tz.date_time,
v.id,
v.value
from
(select
fn_change_timezone(to_date('01/10/2014-00:00:00', 'mm/dd/yyyy-hh24:mi:ss'), 'UTC', 'US/Central') as date_time
from dual
) tz
inner join
(
select
id,
fn_change_timezone (date_time, 'UTC', 'US/Central') AS v_date_time,
value
from a_table_view
where id = 'keyvalue'
) v ON
v.tz_date_time = tz.date_time
希望我解釋好這個問題。
將函數創建爲「不變」或「常量」函數嗎?這告訴優化器它不需要爲每組相同的參數重新調用函數。 –
我不明白這些與Oracle功能有關的術語。 Google搜索時沒有幫助。 – bbaley
對不起,我的錯誤是,你想看看「確定性函數」。 http://www.dba-oracle.com/plsql/t_plsql_deterministic.htm –