欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過使用正確的search arguments來提高SQL Server數(shù)據(jù)庫的性能

 更新時間:2016年11月17日 16:32:50   作者:Wei.T  
今天通過本文給大家介紹在SQL Server上關(guān)于indexing的一個特定的性能問題,本文給大家介紹的非常詳細,具有參考借鑒價值,感興趣的朋友可以參考下

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

今天的文章給大家談談在SQL Server上關(guān)于indexing的一個特定的性能問題。

問題

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

-- Results in an Index Scan
SELECT * FROM Sales.SalesOrderHeader
WHERE YEAR(OrderDate) = 2005 AND MONTH(OrderDate) = 7
GO

上門的代碼查詢一個銷售信息,需要一個特定的月份和年份的,這不是很復雜。但是不幸的的事,這個qeury的效率不行,即使OrderDate這一列已經(jīng)做了Non-Clustered Index??梢钥纯聪旅娴膓eury執(zhí)行圖,你能看到Query Optimizer已經(jīng)選擇了定義在列OrderDate下的Non-Clustered Index,但是SQL Server卻做了Index的一個完整掃描,而不是期待中的Seek operation。

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

解決方案

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

-- Results in an Index Seek
SELECT * FROM Sales.SalesOrderHeader
WHERE OrderDate >= '20050701' AND OrderDate < '20050801'
GO

我們重寫的這個query語句,能達到同樣的效果,不用函數(shù)MONTH了。從此query的執(zhí)行圖來看,SQL Server執(zhí)行了seek operation,在查詢的范圍內(nèi)進行的scan。所以,如果你要在where查詢中用到函數(shù),用到表達式的右側(cè),來避免性能問題。比如下面的例子。

-- Results in an Index Scan
SELECT * FROM Sales.SalesOrderHeader
WHERE CAST(CreditCardID AS CHAR(4)) = '1347'
GO

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

-- Results in an Index Seek
SELECT * FROM Sales.SalesOrderHeader
WHERE CreditCardID = CAST('1347' AS INT)
GO

總結(jié)

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

譯后記

這也是我在看微軟SQL Server認證考試Exam70-461的TrainingKit的時候,它書里面反復強調(diào)的。簡單來講就是保證不要直接用函數(shù)作用在做過index的列上,要用函數(shù)的話,變通到表達式的右側(cè)來。至于為什么會影響性能。因為我對index還不熟悉,我理解的不是很清晰。

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

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

相關(guān)文章

  • 使用SQL實現(xiàn)車流量的計算的示例代碼

    使用SQL實現(xiàn)車流量的計算的示例代碼

    本文主要介紹了使用SQL實現(xiàn)車流量的計算的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 大型項目中Java連接MSSQL的性能優(yōu)化

    大型項目中Java連接MSSQL的性能優(yōu)化

    在大型項目中,Java語言和MSSQL數(shù)據(jù)庫的結(jié)合應用變得越來越流行,這不但是因為Java語言提供高度可移植性和高效處理大量數(shù)據(jù)的優(yōu)勢,而且MSSQL具備高效便捷的存儲和數(shù)據(jù)查詢能力,今天我們將討論如何在Java項目中與MSSQL數(shù)據(jù)庫進行交互
    2024-02-02
  • SQL編程之子查詢及注意事項

    SQL編程之子查詢及注意事項

    這篇文章主要介紹了SQL編程之子查詢及注意事項,需要的朋友可以參考下
    2015-08-08
  • SQL使用登錄名連接數(shù)據(jù)庫報錯(錯誤代碼18456問題)

    SQL使用登錄名連接數(shù)據(jù)庫報錯(錯誤代碼18456問題)

    18456是因密碼或用戶名錯誤而使身份驗證失敗,如果用戶名密碼正確,則該登錄名沒有連接數(shù)據(jù)庫引擎權(quán)限,本文就來介紹一下解決方法,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • SQL Server復制功能要避開缺陷的干擾小結(jié)

    SQL Server復制功能要避開缺陷的干擾小結(jié)

    SQL Server具有強大的復制功能,除了將數(shù)據(jù)和數(shù)據(jù)庫對象從一個數(shù)據(jù)庫復制并準確分發(fā)的另一個數(shù)據(jù)庫中,還要實行數(shù)據(jù)庫之間的同步。
    2011-03-03
  • SQL Server全文檢索查詢淺析

    SQL Server全文檢索查詢淺析

    因為項目需要,需要對上傳的文件內(nèi)容進行查詢。通過MSDN了解到Windows索引服務可以實現(xiàn)對文件的全文檢索,并可以通過SQL Server進行查詢。項目將這兩者結(jié)合,實現(xiàn)對上傳文件的全文檢索的解決方案。
    2009-11-11
  • SQL Server將一列的多行內(nèi)容拼接成一行的實現(xiàn)方法

    SQL Server將一列的多行內(nèi)容拼接成一行的實現(xiàn)方法

    這篇文章主要介紹了SQL Server將一列的多行內(nèi)容拼接成一行的實現(xiàn)方法,需要的朋友可以參考下
    2015-11-11
  • sqlserver添加sa用戶和密碼的實現(xiàn)

    sqlserver添加sa用戶和密碼的實現(xiàn)

    這篇文章主要介紹了sqlserver添加sa用戶和密碼的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • mysql與mssql的md5加密語句

    mysql與mssql的md5加密語句

    mysql與mssql的md5加密語句,需要的朋友可以參考一下
    2013-03-03
  • master數(shù)據(jù)庫損壞的解決辦法有哪些

    master數(shù)據(jù)庫損壞的解決辦法有哪些

    由于sqlserver 2008 master數(shù)據(jù)庫損壞導致sqlserver服務啟動失敗,本文給大家master數(shù)據(jù)庫損壞的解決辦法,感興趣的朋友一起參考下
    2015-10-10

最新評論