2016-06-08 38 views
0

我在Oracle中有這個where子句條件來檢查與給定值相似的名稱,但它返回正確的結果,但運行速度非常慢。有沒有更有效的方法來執行這種情況?謝謝。Slow Oracle執行

AND 
    (P5_ORGN_NAME IS NULL OR 

(D.ORGANIZATION_NAME LIKE '' || upper(P5_ORGN_NAME) || '%' OR D.FORMATTED_ORGANIZATION_NAME like 
'' || local.pkg.orgname_format(upper(P5_ORGN_NAME)) || '%') 
) 
+1

你看執行計劃嗎?它說了什麼? – nvoigt

+2

您想要查看的第一件事是從WHERE子句中刪除此調用'local.pkg.orgnameformat(upper(P5_ORGN_NAME))'。在WHERE子句中調用PL/SQL通常是性能殺手。 –

+0

運行解釋計劃,看看發生了什麼。如果您必須使用此orgname_format函數,請查看基於函數的索引。 – OldProgrammer

回答

2

充分利用pkg.orgname_format功能DETERMINISTIC所以Oracle知道不要一遍又一遍地運行它的每一行。

在你local.pkg包...

FUNCTION orgname_format (p_org_name VARCHAR2) 
    RETURN VARCHAR2 DETERMINISTIC IS 
BEGIN 
    ... 
END; 

這將告訴Oracle的功能始終返回相同的輸入參數相同的數值。知道這一點,Oracle可以執行一次函數,而不是爲查詢中的基礎表中的每一行執行該函數。

當然,如果函數真的是確定性的,聽起來就像是這樣,根據它的名稱判斷,你只能使用它。

+0

這是否工作? –

+0

謝謝馬修!它現在非常快:) – amaach