2011-12-31 86 views
4

什麼是查詢的excution順序,如:在SQL查詢的執行順序WHERE子句

SELECT * FROM [users] WHERE [userid] = 50001 AND [username] = 'new user' 

我的問題是什麼將首先用於匹配 - [用戶ID]或[用戶名]。

等都會影響執行時間。

任何改進此查詢的建議都將被appriciated。

回答

6

答案取決於您提供給SQL引擎的索引。如果userid被索引,但是username不是,則引擎是可能是userid開頭;如果username被索引但userid不是,那麼引擎將可能是開頭的名稱;如果兩個字段都被索引,引擎將搜索該索引,並通過內部ID查找行。請注意,所有這些都高度依賴於您正在使用的RDBMS。當行數很少時,一些引擎會放棄索引搜索,以支持全表掃描。

+0

假設兩列都是非索引的,那麼首先會執行什麼(因爲這是一個例子,我只展示了兩個匹配的條件,但如果有這麼多的AND條件會怎麼樣)? – nirav 2011-12-31 04:46:58

+1

@ nirav.patel在沒有索引的情況下,RDBMS可以自由選擇它計算的任何順序,從而獲得最佳性能。一些RDBMS引擎(例如Oracle)會計算您的數據分散的統計數據以選擇最佳訂單。例如,如果RDBMS知道您的ID列在40000行的表中具有40000個不同的值,並且名稱具有3000個不同的值,則它首先會查看ID,因爲它承諾提供更具體的答案。 – dasblinkenlight 2011-12-31 05:01:52

+0

如何找到哪些列在pl/sql中編入索引? – 2016-04-14 16:15:18

0

基於SQL的數據庫引擎通常會根據羣集(數據記錄的物理順序)和任何可用索引進行優化。 MySQL和MS SQL Server(至少也是很多其他的)都足夠聰明,可以知道執行過濾器的順序來優化查詢。

出於您的目的,沒有關係,並且執行結果將以完全相同的方式,以相同的性能順序排列。

+0

但是,如果AND條件更多地說15,那麼在那種情況下將會是什麼序列。 – nirav 2011-12-31 04:45:15

2

該數據庫將決定什麼順序執行的條件。

通常(但並不總是)將首先在可能情況下使用索引。

你可以看到在條件或加入如何有待優化: - SQLStatementExecution - Example Discussion1 - Example Discussion2 - Example Discussion3

一般來說,WHERE子句評估和優化的標準順序通過查詢優化器創建執行計劃之前。這很好。不過,我鼓勵您在投入生產之前查看每個查詢的查詢執行計劃。