2014-07-16 37 views
0

我有一個要求,從表A中獲取表B中沒有的數據。有誰能告訴我哪種方式在運行時間方面會比以下所有查詢更有效。提高SQL的性能

select col1 from A 
minus 
select col1 from B 

select col1 from A where not exists (select 1 from B where A.col1=B.col1) 

select X from (select A.col1 as "X" ,B.col1 as "Y" from A left outer join B on A.col1=B.col1) where Y is null 
+0

您可以使用「解釋計劃」來確定這一點。根據它,最後2個查詢具有相同的成本,並且比第一個稍快。另一方面,使用set操作(union,minus,intersect)會更快...... –

回答

0

對於任何形式的問題「什麼是寫X語句的最有效的方法」,答案總是相同的 - 這取決於它。

基於成本的優化器(CBO)考慮了各種涉及表中數據的統計數據,以便決定使用什麼計劃。根據您的數據,這三個查詢完全可能產生相同的查詢計劃(並因此具有相同的性能)。也有可能你會得到三種不同的計劃。如果您得到不同的計劃,您需要查看哪些計劃對您的對象和您的硬件上的數據最有效。當然,隨着數據的變化,CBO可以自由地爲您的SQL語句提出不同的(希望更好的)計劃,所以「最佳」計劃是一個移動目標。明天可能效率最高的計劃可能效率不高。

鑑於這一點,我的偏見總是從查詢中開始,最清楚地表達了我試圖實現的邏輯。編寫最可讀的SQL,並讓優化器提出計劃。如果一個特定的查詢結果是一個瓶頸,並且需要對其進行優化,則其中一個選擇是重寫查詢(如果優化器碰巧選擇效率較低的計劃,則Oracle有很多其他方式來影響查詢計劃需要重寫查詢)。對我而言,MINUSEXISTS都是編寫SQL語句的相對清晰的方式,所以我也不反對。另一方面,LEFT JOIN讓我不那麼清楚 - 你故意在內部查詢中請求數據,然後在另一層過濾掉 - 所以我不會建議在沒有有力證據的情況下使用這種方法實際上在您的環境中效率更高。

+0

Thanks @ justin-cave – user3123752