我知道這是一個常見問題,我已經閱讀了其他幾篇文章和論文,但是我找不到一個考慮索引字段和兩個查詢都可能返回的記錄數量的問題。嵌套選擇的性能
我的問題確實很簡單。在這裏推薦使用類似於SQL的語法(在性能方面)編寫這兩者中的哪一個。
首先查詢:
Select *
from someTable s
where s.someTable_id in
(Select someTable_id
from otherTable o
where o.indexedField = 123)
第二個查詢:
Select *
from someTable
where someTable_id in
(Select someTable_id
from otherTable o
where o.someIndexedField = s.someIndexedField
and o.anotherIndexedField = 123)
我的理解是,第二個查詢將在數據庫中查詢每一個元組外查詢將返回在第一個查詢將評估先選擇內部,然後將過濾器應用於外部查詢。
現在,第二個查詢可能會查詢數據庫超快,考慮到someIndexedField字段已編入索引,但說我們有成千上萬或數百萬記錄不會更快使用第一個查詢嗎?
注意:在Oracle數據庫中。
。 。一般來說,沒有指定數據庫的性能問題是毫無意義的。 SQL是一種描述性語言,而不是過程語言,所以優化器(引擎的一部分)可以自由選擇任何查詢計劃對於給定查詢的最佳選擇。 –
@GordonLinoff好點。該數據庫是一個Oracle數據庫。這個語言應該不是很重要,我想只是用SQL語法來編寫它。 – mixkat
。 。根據Tom Kyte的說法,Oracle優化器足夠智能,可以識別相關的子查詢並將它們轉換爲適當的連接(http://asktom.oracle.com/pls/apex/f?p=100:11:0::NO :: P11_QUESTION_ID:3167884300346662300)。 Oracle有一個非常好的優化器。有趣的是,第一個版本在MySQL中性能完全可觀。 。 。直到解決問題的版本5.6。 –