2013-03-11 27 views
2

是否爲了您構建查詢影響性能時指定?或者SQL進行智能篩選。Where語句中的順序是否符合性能?

例如,假設我有200萬條記錄的Employee表:

Employee(emp_id, name, dept_id, country_id) 

不讓說,我想在國家ID 500和部門ID的員工ID和名稱17 不是讓說那個部門大約有30萬,在那個國家大約有100萬,但是那些符合這兩個標準的人的結果是5萬。

難道做一個性能比較差,如果我做的:

SELECT * 
FROM employees 
where dept_id = 17 and country_id= 500 

比,如果我做的:

SELECT * 
    FROM employees 
    where country_id= 500 and dept_id = 17 

假設後者將表削減至100萬,然後從那裏做休息和 第一個查詢將削減至30萬,並從那裏做第二個過濾器。

如之前提到的,我不確定但是這是SQL電機如何處理查詢。

+1

如果沒有指數將回落到全表掃描反正。 – Andrey 2013-03-11 19:02:18

+1

你知道,你可以讓服務器向你展示執行計劃,它將向你解釋一切。 – Andrey 2013-03-11 19:02:43

回答

1

它確實會影響,特別是當您的執行計劃中有殘留謂詞時,但大多數情況下查詢優化器會爲您重新排序謂詞。

當然,假設您的索引和統計信息保持良好並且已更新,因此需要對其進行說明。

延伸閱讀:http://sqlserverpedia.com/wiki/Index_Selectivity_and_Column_Order

1

大多數現代RDMBS在聲明的部分WHERE中的值的順序不會有問題,它們的查詢優化器在大多數情況下會按照您描述的方式對它進行整理以最大化性能。

我知道究竟是誰都會受到影響,如果你選擇了「錯誤」的順序相當顯著一些舊的RDBMS的,但這些應該是過時的過去十年。

1

在上述表中,

如果非聚集索引是有 -

(COUNTRY_ID,dept_id爲,EMPLOYEE_ID)在表中,

那麼查詢 -

SELECT * 
    FROM employees 
    where country_id= 500 and dept_id = 17 

會有更好的表現。

如果非聚集索引是有 -

(dept_id爲,COUNTRY_ID,EMPLOYEE_ID)在表中,

那麼查詢 -

SELECT * 
    FROM employees 
    where dept_id = 17 and country_id= 500 

將有更好的性能。

如果沒有非聚集索引是存在的,

然後查詢 -

SELECT * 
    FROM employees 
    where dept_id = 17 and country_id= 500 

將有第二過濾子更好的表現在數量更低。

另外提一下,

如果兩個非聚集索引都在那裏,

然後查詢 -

SELECT * 
    FROM employees 
    where dept_id = 17 and country_id= 500 

將有第二過濾子更好的表現在數量更低。

相關問題