我最近在oracle數據庫中移動了一段代碼,其中一位經驗豐富的開發人員提到我有太多的exists
和not exists
陳述和應該有一種方法可以將它們刪除,但是由於他不得不使用它並且不太記得它的工作原理,所以它已經太久了。目前,我回過頭來讓代碼更易於維護,因爲隨着業務邏輯/需求的變化,這部分代碼可能會在未來幾年內多次更改,並且我希望繼續優化它,同時使它更易於維護。通過刪除'存在'和'不存在'來優化Oracle查詢
我嘗試過查找它,但是我可以找到的所有建議都是用not exists
代替not in
,並且不返回實際結果。
因此,我想知道什麼可以做,以優化出exists
/not exists
或是否有寫exists
/not exists
一種方式,以便(比我可能可以在一個更好的程度),甲骨文將在內部優化。
例如,如何優化以下內容?
UPDATE
SCOTT.TABLE_N N
SET
N.VALUE_1 = 'Data!'
WHERE
N.VALUE_2 = 'Y'
AND
EXISTS
(
SELECT
1
FROM
SCOTT.TABLE_Q Q
WHERE
N.ID = Q.N_ID
)
AND
NOT EXISTS
(
SELECT
1
FROM
SCOTT.TABLE_W W
WHERE
N.ID = W.N_ID
)
有沒有機會,「更有經驗的開發人員」對MySQL更有經驗? (在MySQL中,使用select的左外連接...其中null通常比not exists子句執行得更好,但在Oracle和許多其他數據庫中,not exists子句的性能通常會更好。) – 2013-04-25 15:43:37
據我所知,他只是PL/SQL,並且提到Steven Feuerstein的Oracle PL/SQL編程作爲他閱讀優化的來源。他有可能錯誤地記住了不同的優化;人類確實有一個已知的錯誤,其中記憶可能部分錯誤。 – Lawtonfogle 2013-04-25 16:03:27
Google書籍似乎總是在您提到的書中顯示此頁面:http://books.google.co.uk/books?id=vUbJkdl6vIcC&pg=PA848&dq="Oracle+PL/SQL+Programming"+"Steven+Feuerstein 「+」不+ +存在「 - 這不直接相關。然而,這個網頁:http://dbpedias.com/wiki/Oracle:Coding_Best_Practices_-_Using_EXISTS/NOT_EXISTS(這似乎是由Feuerstein先生撰寫的)基本上與現在的答案大致相同。最後,'減號'有時可能勝過'不存在' - 請參閱http://tech.dir.groups.yahoo.com/group/toad/message/23271?source=1&var=1。 – 2013-04-25 16:22:49