2016-04-15 38 views
-2

有誰知道如何提高以下多個Oracle SQL查詢NOT NULL與OR操作:多個IS NOT NULL使用OR操作

select count(1) 
    from s_srv_req sr, s_evt_act act, s_bu bu 
    where sr.row_id = act.sra_sr_id(+) 
    and sr.bu_id = bu.row_id 
    and sr.last_upd > to_date('31-DEC-2013','DD-MON-YYYY') 
    and **(X_REASON_CODE1 is not null 
     OR X_REASON_CODE2 is not null 
     OR X_CONCERN_CODE1 is not null 
     OR X_CONCERN_CODE2 is not null 
     OR X_COMPONENT_CODE is not null)** 

這裏的目的是獲取所有記錄,即使在一個代碼列不爲null。 注意:這個查詢花費了很多時間,並且我不能在這樣的時間進行查詢。提前致謝。

+0

是否建立了'不null'和'或'是什麼是真正減緩下來?執行計劃顯示了什麼? (另外,請考慮使用ANSI連接語法)。 –

+0

您是否在所有代碼列和連接列上都有索引? –

+0

檢查WHERE子句中的所有列以查看它們是否具有索引。 –

回答

1

您應該使用COALESCE函數

select count(1) 
    from s_srv_req sr, s_evt_act act, s_bu bu 
    where sr.row_id = act.sra_sr_id(+) 
     and sr.bu_id = bu.row_id 
     and sr.last_upd > to_date('31-DEC-2013','DD-MON-YYYY') 
     and COALESCE(X_REASON_CODE1, X_REASON_CODE2, X_CONCERN_CODE1, X_CONCERN_CODE2, X_COMPONENT_CODE) is not null