[翻譯]通過使用正確的search arguments來提高SQL Server資料庫的效能

來源:互聯網
上載者:User

標籤:using   查詢   www   部落格   尋找   order   避免   ini   為我   

原文地址:http://www.sqlpassion.at/archive/2014/04/08/improving-query-performance-by-using-correct-search-arguments/

Improving Query Performance by using correct Search ArgumentsApril 8, 2014 · Klaus Aschenbrenner ·

通過使用正確的search arguments來提高資料庫的效能

今天的部落格,我想談談在SQL Server上關於indexing的一個特定的效能問題

問題

看看下面的簡單的query語句,可能你已經在你看到過幾百次了

-- Results in an Index ScanSELECT * FROM Sales.SalesOrderHeaderWHERE YEAR(OrderDate) = 2005 AND MONTH(OrderDate) = 7GO

上門的代碼查詢一個銷售資訊,需要一個特定的月份和年份的,這不是很複雜。但是不幸的的事,這個qeury的效率不行,即使OrderDate這一列已經做了Non-Clustered Index。可以看看下面的qeury執行圖,你能看到Query Optimizer已經選擇了定義在列OrderDate下的Non-Clustered Index,但是SQL Server卻做了Index的一個完整掃描,而不是期待中的Seek operation。

這實際上不是SQL Server的限制,而是relational database都是這樣的。只要你對一個做了index的列(Search Argument)加了函數操作,資料庫引擎就必須再次掃描這個index,而不是去直接執行seek operation

 

解決方案

為瞭解決上門的問題,必須要避免在列上門直接應該函數,比如上面的問題可以用下面的代碼來代替

-- Results in an Index SeekSELECT * FROM Sales.SalesOrderHeaderWHERE OrderDate >= ‘20050701‘ AND OrderDate < ‘20050801‘GO

我們重寫的這個query語句,能達到同樣的效果,不用函數MONTH了。從此query的執行圖來看,SQL Server執行了seek operation,在查詢的範圍內進行的scan。所以,如果你要在where查詢中用到函數,用到運算式的右側,來避免效能問題。比如下面的例子。

-- Results in an Index ScanSELECT * FROM Sales.SalesOrderHeaderWHERE CAST(CreditCardID AS CHAR(4)) = ‘1347‘GO

這個query會使SQL Server掃描了整個Non-Clustered Index。所以當表變得更大的時候,這個擴充性等各方面就很差了。如果把函數放在運算式的右側,SQL Server就能執行seek operation了

-- Results in an Index SeekSELECT * FROM Sales.SalesOrderHeaderWHERE CreditCardID = CAST(‘1347‘ AS INT)GO

 

總結

通過今天的blog,我想你們已經認識到了不要在做過indexed的列上直接應用函數,不然SQL Server會掃描你整個index,而不是做seek operation。當你的表變得越來越大的時,你會崩潰的。

 

譯後記

這也是我在看微軟SQL Server認證考試Exam70-461的TrainingKit的時候,它書裡面反覆強調的。簡單來講就是保證不要直接用函數作用在做過index的列上,要用函數的話,變通到運算式的右側來。至於為什麼會影響效能。因為我對index還不熟悉,我理解的不是很清晰。

我大概猜想如下,先記下,歡迎討論。

對某一個列做index,是不是類似對這一列的資料做一個hash映射,當在尋找這一列的資料的時候,直接可以做O(1)的操作(是不是就是它講的seek operation)。如果對這一列使用了函數,SQL Server的機制就是不會重新做一個作用了函數後的列的hash,它就簡單的一個一個的比較了。是O(N)的操作了。

  

 

  

[翻譯]通過使用正確的search arguments來提高SQL Server資料庫的效能

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.