婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 通過使用正確的search arguments來提高SQL Server數據庫的性能

通過使用正確的search arguments來提高SQL Server數據庫的性能

熱門標簽:互聯網電話外呼系統 400電話辦理泰安 安卡拉地圖標注app 零成本地圖標注賺錢 我要地圖標注數量有限制嗎 家庭農場地圖標注名稱怎樣起名 電銷需要外呼系統嗎 千呼電話機器人可以試用嗎 電話機器人怎么代理商

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

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

問題

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

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

上門的代碼查詢一個銷售信息,需要一個特定的月份和年份的,這不是很復雜。但是不幸的的事,這個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 Seek
SELECT * FROM Sales.SalesOrderHeader
WHERE OrderDate >= '20050701' AND OrderDate  '20050801'
GO

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

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

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

-- Results in an Index Seek
SELECT * FROM Sales.SalesOrderHeader
WHERE 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)的操作了。

您可能感興趣的文章:
  • Windows下使用性能監視器監控SqlServer的常見指標
  • sqlserver2005利用臨時表和@@RowCount提高分頁查詢存儲過程性能示例分享
  • sqlserver 三種分頁方式性能比較[圖文]
  • sqlserver 高性能分頁實現分析
  • 開啟SQLSERVER數據庫緩存依賴優化網站性能

標簽:來賓 東營 新鄉 大同 濱州 黃山 文山 池州

巨人網絡通訊聲明:本文標題《通過使用正確的search arguments來提高SQL Server數據庫的性能》,本文關鍵詞  通過,使用,正確,的,search,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《通過使用正確的search arguments來提高SQL Server數據庫的性能》相關的同類信息!
  • 本頁收集關于通過使用正確的search arguments來提高SQL Server數據庫的性能的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 南通市| 德庆县| 游戏| 舒城县| 高州市| 筠连县| 阿巴嘎旗| 诸暨市| 平潭县| 长武县| 边坝县| 建昌县| 陆丰市| 新河县| 双桥区| 汤阴县| 鲁山县| 盈江县| 嵊泗县| 隆尧县| 满城县| 开鲁县| 新和县| 马边| 柳河县| 辛集市| 定日县| 上思县| 同德县| 土默特右旗| 昆明市| 佛坪县| 宾川县| 比如县| 台东市| 二手房| 潢川县| 澄城县| 屏山县| 平潭县| 射阳县|