2009-07-14 212 views
1

哪一個是更快簡單的SQL查詢

select * from parents p 
inner join children c on p.id = c.pid 
where p.x = 2 

OR

select * from 
(select * from parents where p.x = 2) 
p 
inner join children c on p.id = c.pid 
where p.x = 2 
+8

查詢計劃說什麼? – n8wrl 2009-07-14 11:33:09

回答

6

MySQL,第一個是更快:

SELECT * 
FROM parents p 
INNER JOIN 
     children c 
ON  c.pid = p.id 
WHERE p.x = 2 

,由於使用在線視圖意味着產生和兩次傳遞記錄。

在其他引擎中,通常會優化它們以使用一個執行計劃。

MySQL在並行化和流水線結果流方面不是很好。

喜歡此查詢:

SELECT * 
FROM mytable 
LIMIT 1 

是即時的,而這一個(它在語義上是相同的):

SELECT * 
FROM (
     SELECT * 
     FROM mytable 
     ) 
LIMIT 1 

將首先從mytable選擇的所有值,某處緩衝它們,然後取第一個記錄。

對於Oracle,SQL ServerPostgreSQL,上面的查詢(和您的兩個查詢)最有可能產生相同的執行計劃。

4

我知道這是一個簡單的例子,但你的第一個選項比第二個選項更可讀。只要這兩個查詢計劃具有可比性,我總是會選擇更適合您的第一個示例適用的SQL代碼。

0

我想第一個。我不確定優化器是否會在第二個查詢中的派生表上使用任何索引,或者是否會在回到子項之前將匹配到內存中的所有行復製出來。

0

這就是爲什麼你有DBA。它完全取決於DBMS,以及您的表和索引如何配置,以及哪個運行速度最快。

數據庫調整不是一個「一勞永逸」的操作,它應該隨着數據的變化定期完成,以確保數據庫以最佳性能運行。如果沒有指定,這個問題是沒有意義的:

  • 你正在問什麼DBMS。
  • 你在桌上有什麼索引。其他可能的配置項目(也可能取決於DBMS,如羣集)的主機。

您應該通過查詢優化器運行這兩個查詢,以查看哪一個查詢是最快的,然後開始使用該查詢。這是假設首先顯着的區別。如果差異很小,那麼最簡單的閱讀/維護。

0

對於我而言,在第二個查詢中,您說我不相信優化器優化此查詢,所以我會提供一些「提示」。

我會說,相信優化器,直到它讓你失望,然後才考慮嘗試爲其優化器的工作。

2

這取決於數據庫在優化查詢時表現如何。

如果數據庫設法優化第二個到第一個,它們同樣快,否則第一個更快。

第一個爲數據庫提供了更多的自由來優化查詢。第二個建議一個特定的做事順序。要麼數據庫能夠看到過去並將其優化爲單個查詢,要麼將查詢作爲兩個單獨的查詢並將子查詢作爲中間結果運行。

像SQL Server這樣的數據庫會保留關於數據庫表所包含內容的統計信息,該數據庫表用於確定如何以最有效的方式執行查詢。例如,根據將刪除大多數記錄的內容,它可以從加入表格開始或過濾條件表中的parents表格。如果您編寫強制執行特定訂單的查詢,那可能不是最有效的訂單。