2013-07-25 183 views
2

交貨表有1731791+行。 具有0,1,NULL值的homedl列。NVL()降低性能

我要取的記錄,每當homedl列不等於1

哪個查詢將在這裏給出最佳的性能

select homedl 
    from delivery 
where item_id='1343275' 
    AND NVL(homedl,0) <> 1 
    and item_type=0; 

OR

select homedl 
    from delivery 
where item_id='1343275' 
    AND (homedl<>1 or homedl is null) 
    and item_type=0; 
+1

只需檢查執行計劃,也許? –

+3

您是否嘗試過運行並查看性能並解釋計劃?如果你在item_id上有一個索引,那麼它應該是無關緊要的。 –

+1

查詢計劃是否有所不同?我期望這兩個查詢產生相同的計劃,並因此執行相同的操作。如果'homedl'上有索引,則使用函數或查找NULL值可能會阻止索引被使用。如果您聲明自己的性能不佳,那麼我會懷疑添加'NVL'會阻止使用索引,通過創建基於函數的索引可以彌補索引的不足。 –

回答

1

首先,讓我們看看數據,許多交貨記錄怎麼有homedl = 1或homedl = 0或homedl爲null:

select homedl , count(*) 
    from delivery 
group by homedl 

如果零點和零點的計數大於計數顯著小ONES,那麼你應該創建一個將用於該查詢功能基於指數:

create index user2582602_idx on delivery (NVL(homedl,0)); 

,然後選擇這樣的:

select homedl 
    from delivery 
where item_id='1343275' 
    AND NVL(homedl,0) = 0 
    and item_type=0; 
+0

謝謝。上面的邏輯是現在生活中...我沒有看到任何重大的時間差異後添加此條件.. – spyga

0

回答您的問題取決於許多因素,例如RDBMS供應商,homedl列中存在哪種類型的索引(如果有)。我認爲item_iditem_type已經被適當地編入索引。

您可以更好地使用以下查詢:從交貨

選擇homedl其中ITEM_ID = '1343275' AND coalesce(homedl, 2)<>1和ITEM_TYPE = 0;

如果item_id是主鍵,然後查詢執行時間不會有問題你提到不同的查詢,因爲explain [sql query]會告訴你,使用的密鑰是PRIMARY

+0

它也依賴於RDBMS供應商,因爲按位索引實現可能會因不同供應商而有所不同,或者可能根本不可用。 – RRM