2013-06-21 91 views
0

在SQL Server Management Studio的2012年,我運行此查詢:爲何在包含WHERE的情況下SELECT命令運行得更快?

SELECT * FROM Contacts 

此查詢成功執行約44秒。

SELECT * FROM Contacts WHERE FirsttName = 'David" 

該查詢在約0秒內成功執行。所以我想我的問題是什麼導致這些查詢時間如此不同。從我公認的天真的角度來看,我認爲在這兩種情況下,所有的錶行都需要進行調查,以檢查FirstName是否等於'David',並且條件不應該具有這麼大的影響。實際上,由於額外的檢查,我認爲查詢會花費更長的時間。

另一個實例是:

SELECT * FROM Jobs 

成功執行在大約25秒。

SELECT * FROM Jobs WHERE JobName = "Sales" 

在大約0秒內成功執行。

這不是一個危及生命/阻塞/哦我的上帝爲什麼我不能解決這個問題。只是讓我想知道的事情。

+1

可能在這些列上定義了索引。 – muratgu

+0

它發生在所有列。 – dckuehn

+0

最重要的因素是找到的記錄數。他們必須被移動。 –

回答

2

這取決於很多因素。正如Bobek所提到的,時間問題可能只是返回所有記錄的時間。假設您只是在處理時間。

第一個問題是:您是否考慮過緩存效應多次運行這些結果?如果您運行第一個查詢,表將被加載到內存中,並將保留在那裏。包括第一個表在內的後續查詢將在第二次時快得多,快得多。在進行時間安排時,你必須非常小心。

另一種可能性是索引的存在,儘管我懷疑FirstName上會有索引。索引大大減少了獲取記錄的時間。它只是去索引找到正確的記錄,查找它們,並返回結果。最後,由於select *,您的查詢必須獲取頁面上的數據。

至於檢查時間較長,這確實是一個非問題。處理頁面的時間通常會比記錄上的布爾操作大得多。許多其他因素對性能影響較大。

我的猜測,你的情況是,你運行問題中描述的查詢,性能差異是由於緩存效應。

+0

現在我只是覺得很傻。 – dckuehn

2

這是因爲where語句篩選出您不想選擇的行。這意味着如果只有10000行中的一行具有名字「大衛」,它只會拉出一行而不是整個10000行。這是否有意義?

此外,該表使用索引和統計數據來快速搜索您正在查找的數據,因此很可能它會比通過查看所有行更快。

相關問題