2010-10-20 80 views
1

我有一個表,其中的列isprocessed位爲空。我在這一列上創建了一個索引(非聚簇)。在應用索引查詢之前TSQL-兩個查詢之間有什麼區別

**`SELECT top 5000 * From Request Where IsProcessed Is Null`** 

花了30到40秒。請記住,這是超過1000萬行的非常巨大的表格。 現在,在isprocessed列上創建索引後,相同的查詢未顯示性能提升。

我嘗試另一個查詢 **

;With TopN As(SELECT Top 5000 * from Request Order By IsProcessed) 
SELECT * From TopN Where IsProcessed Is Null 

** 現在這個查詢suprizingley使輸出小於2秒 我不知道爲什麼會出現在兩個查詢任何perforamnce差異。還有什麼是空位列上的索引行爲

+1

作爲@Thomas注意,這2個查詢不一定會返回相同的行數,甚至相同的行... – 2010-10-20 07:12:01

回答

1

打開'顯示實際執行計劃'以查看在每種情況下正在使用哪些索引。

如果您在低選擇性列(如位域)上創建索引,優化程序可能不會使用它(取決於)。

如果您有'IsProcessed'位列,並且設置的行少於10%,並且您搜索這些設置,則可以使用該索引。然而,如果您在2狀態字段(如性別('M','F')')上具有大約50%/ 50%值的索引,則優化程序很可能不會使用該索引。

0

第二個查詢將選擇500強第一,然後應用where子句,其中第一個查詢將首先應用在where子句,然後將頂部5000

看一看SQL SERVER – Logical Query Processing Phases – Order of Statement Execution

+0

正確,但在第二個查詢中有一個order by子句,因此它意味着它將按順序應用,然後選擇top 5000行。第二個查詢中按列排序與第一個查詢中列的位置相同。因此,據我瞭解,這是索引,這有助於第二個查詢快速運行,因爲索引列按照子句順序排列。問題是,如果該列位於where子句中,爲什麼不能使用此索引。 – ZafarYousafi 2010-10-20 08:10:31