SQL -- 使用聯結還是子查詢?
關於子查詢,由來已久的傳統觀念認為,如果可以的話,使用聯結會更好些。在某些情況下,該觀點完全爭取,但有時候在不同場合,根據不同考慮,使用時會有一定傾向性。下表討論了決定效能權衡的某些問題,以及傾向於哪一種解決方案:
情況 |
傾向於 |
從子查詢中返回的數值對於外部查詢中的所有行是相同的 |
預查詢。宣告變數,然後選擇需要的值放入變數中,這能使即將形成的子查詢只執行一次,而不是對外部表中的每一條記錄執行一次。事實上SQL Server中的優化器相當聰明,它一旦察覺到處於這樣的情形,將為你進行預查詢,但是別依賴它。為了以防萬一,當你意識到這樣的情形時,請執行你自己的預查詢。 |
兩個表都相對較小(例如:只有10 000條記錄或者更少) |
子查詢。不清楚確切的原因是什麼,但是,經過實驗可知,當所有的查詢資料僅僅屬於一、兩個資料頁時,查詢比起聯結花費的開銷更少。 |
在考慮了所有的條件後,匹配將只返回一個值 |
子查詢。同樣,比起必須聯結整張表來說,只找尋一條記錄並代換它所需的開銷要少得多。 |
在考慮了所有的條件後,匹配將只返回相對較少的值,並且,在查詢列上沒有索引 |
子查詢。通常,比起雜湊聯結來說,單獨的一次或者甚至數次查詢將花費較少的開銷。 |
查詢表相對較小,基表很大 |
若可以的話,則使用巢狀子查詢;若聯結相對於相關子查詢,則使用聯結。使用子查詢時,查詢只發生一次,因而其開銷相對較小。然而,如果使用的是相關子查詢,則查詢將會迴圈許多次-----既如此,大多數情況此案聯結將是更好的選擇。 |
相關子查詢與聯結 |
聯結。本質上,相關子查詢將造成巢狀迴圈的情形。這會產生相當多的開銷。多數情況下,他遠遠快於遊標,但是,它比其他可能的選擇方案要慢一些。 |
派生表與其他選擇 |
派生表常常意味著大量的開銷,因此需要謹慎使用。要知道,派生表只執行一次,隨後就會駐留於記憶體中,因而,多數的開銷存在於首次建立的過程中以及沒有索引的較大結果集上。它們可能很快、也可能很慢,這取決於具體的情況。在進行編寫派生表前要仔細考慮。 |
EXISTS與其他選擇 |
EXISTS。不必針對同樣的條件進行多次查詢------但找到了特定行的一個匹配,將進入到下一個查詢中,這能夠極大地減少開銷。 |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-616844/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL聯結查詢和子查詢MySql
- sql子查詢SQL
- 區分關聯子查詢和非關聯子查詢
- exist-in和關聯子查詢-非關聯子查詢
- 【SQL】使用分析函式與關聯子查詢的比較SQL函式
- SQL查詢的:子查詢和多表查詢SQL
- 複雜查詢還是直接寫sql吧SQL
- 什麼是SQL 語句中相關子查詢與非相關子查詢SQL
- SQL--子查詢SQL
- 查詢策略選擇:使用 JOIN 還是多條 SQL 語句SQL
- Sql Server系列:子查詢SQLServer
- 使用子查詢
- OCP課程8:SQL之使用子查詢SQL
- 關聯查詢子查詢效率簡單比照
- 一文終結SQL 子查詢優化SQL優化
- MySQL exists關聯子查詢SQL效能及其低下最佳化之等值子查詢轉換MySql
- 關聯子查詢 Correlated Subqueries
- sql語法相關子查詢與非相關子查詢SQL
- 為什麼 SQL 語句使用了索引,但卻還是慢查詢?SQL索引
- sql遞迴查詢子級SQL遞迴
- SQL查詢總結SQL
- 關聯子查詢的用處
- SQL 三表聯合查詢SQL
- 01-sql-聯合查詢SQL
- 子查詢-表子查詢
- sql-server不相關子查詢SQLServer
- sql-server相關子查詢SQLServer
- SQL語言基礎(子查詢)SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-帶有子查詢的查詢結果集處理SQL
- 教你使用SQLite 子查詢SQLite
- [MYSQL -14]使用子查詢MySql
- SQL三表左關聯查詢SQL
- 兩表關聯查詢:sql、mybatisSQLMyBatis
- 為什麼我使用了索引,查詢還是慢?索引
- OCP課程19:SQL之使用子查詢檢索資料SQL
- Hierarchical Queries 級聯查詢(樹狀結構查詢)
- ORACLE_OCP之SQL_子查詢OracleSQL
- SQL 把查詢結果當作"表"來使用SQL