Dynamic Parameters造成的linked server效能問題
曾今遇到這樣一個linked server的效能問題。
客戶這邊的linked server是從一臺SQL Server 2000的伺服器連線到一臺後端的Oracle的資料庫。客戶遇到的問題是,他們將linked server執行在out of process模式下時,執行一句類似”select * from Oracleserver.databasename.schema.T where…”的查詢來獲取Oracle上的資料,但該查詢花了很長時間都沒執行結束。然而,再另一臺SQL Server上建立linked server (執行在in process模式下)連線到同樣的Oracle資料庫,執行同樣的語句,結果就能很快返回。
是什麼原因造成了這樣的效能差異呢?
客戶通過跟蹤Oracle的查詢執行狀況,發覺在有問題的Linked Server上,執行查詢時會在Oracle那邊對錶T做一個全表掃描,然後把表T上所有的資料返回給SQL Server。然後在SQL Server那段對這些資料做過濾(也就是所有的where條件都是在SQL Server中被執行的)。不過在那套好的linked server上,所有的過濾操作是在Oracle端就執行完成的,然後Oracle端直接把過濾完的資料返回給SQL Server。在表T的資料量非常大的情況下,這兩種不同的行為會造成返回到SQL Server端得資料量有巨大的差異。考慮到網路傳輸大資料的延遲和SQL Server需要呼叫大量IO來快取接受到的資料,這種行為的差異會最終導致查詢效能上的巨大區別。
客戶一開始以為是out of process模式的問題,但是即使我們把有問題的linked server設定為in process模式下,問題依舊存在。
我們這裡搭建了一個測試環境來模擬客戶那裡遇到的問題,並且查閱了相關的資料。我們發覺,當linked server使用四段式方式(Oracleserver.databasename.schema.T這樣的形式)來訪問後端Oracle資料庫的時候,預設行為就是把所有的資料傳送給SQL Server然後在SQL Server端做過濾。也就是說,這事實上是MSDAROA(微軟的Oracle驅動)的一個標準行為。
那麼是什麼原因使得另一套Linked Server會直接在Oracle端做過濾呢?
最終的研究表明這其實是受到一個叫”Dynamic Parameters”的MSDAROA設定的影響。當”Dynamic Parameters”被設定為1的時候,就會出現這種狀況。
你可以到以下注冊表項下面找到Dynamic Parameters的設定。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\MSDAORA]
如果你找不到Dynamic Parameters這個值或者這個值為1,則資料就是在Oracle端先過濾然後返回。反之,如果Dynamic Parameters值為0(即disabled),則會把所有資料都返回到SQL Server端。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25175503/viewspace-704834/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql 字符集造成的效能問題MySql
- sqlserver的waitresource等待事件是linked server連結伺服器的問題SQLServerAI事件伺服器
- Sqlserver 如何truncate linked server的表SQLServer
- sqlserver建立linked server到redshift的方法SQLServer
- because it is a JDK dynamic proxy that implements 問題JDK
- postgresql端使用tds_fdw建立訪問sqlserver的linked server的操作說明SQLServer
- SQL SERVER資料庫datediff函式引發的效能問題SQLServer資料庫函式
- SQL Server 連結伺服器(Linked Servers)SQLServer伺服器
- 解決Parameter '__frch_item_0' not found. Available parameters 問題AI
- Fotify掃描問題Dynamic Code Evaluation:Code Injection
- FrameLayout裡有CardView造成的顯示順序問題View
- 建立Dynamic Web Project沒有web.xml問題WebProjectXML
- Java解決遞迴造成的堆疊溢位問題Java遞迴
- FastJsonHttpMessageConverter造成返回結果多次序列化的問題ASTJSONHTTP
- Python原始檔一行字元過長造成的問題Python字元
- QtWebEngine效能問題QTWeb
- 集合效能問題
- SQL Server 2016升級遷移過程中效能問題解決案例SQLServer
- 淺談SQL Server中的快照問題SQLServer
- 關於 Puerts 的效能問題
- dev-server失蹤問題devServer
- 問題MySQL server has gone awayMySqlServerGo
- 【故障公告】取代 memcached 的 redis 出現問題造成網站故障Redis網站
- Vue 重複使用同一元件造成的問題Vue元件
- 使用vue-server-render時碰到的問題VueServer
- 兩個小問題深入淺出List的效能問題
- v-if與v-show造成部分元素丟失的問題——v-if複用元素問題
- 關於開發Cesium造成的電腦風扇狂飆的問題
- 解決stderr重定向到stdout造成的輸出亂序問題
- 由於網路延遲造成邏輯鎖過期的問題
- git server“丟失”commit問題探究GitServerMIT
- 關於解決Server Tomcat v9.0 Server at localhost failed to start的問題ServerTomcatlocalhostAI
- 【ERROR】儲存鏈路問題造成oracle錯誤,ora-600[4193] 問題處理ErrorOracle
- (轉)認清效能問題
- sqlhelper整合dynamic多資料來源的分頁問題(非教學向)SQL
- 幽默:問題Bug出在哪裡呢?測試本來是幫助減少問題,卻造成了問題。
- Postgresql Linked server遠端伺服器取資料的執行計劃原理SQLServer伺服器
- Sqlserver linked server指向Excel報錯編號為7399和7303的解決方法SQLServerExcel
- 當Bcrypt與其他Hash函式同時使用時造成的安全問題函式