1. 問題
系統(tǒng)有個(gè)模塊,需要查詢Oracle數(shù)據(jù)庫中的數(shù)據(jù)。目前是通過建立鏈接服務(wù)器實(shí)現(xiàn)的。
SQLServer訪問Oracle實(shí)現(xiàn) 可參考這篇文章 http://www.cnblogs.com/gnielee/archive/2010/09/07/access-oracle-from-sqlserver.html
目前的查詢語句就是一個(gè)簡(jiǎn)單的帶where條件的查詢語句,類似如下:
SELECT * FROM LINKED_NAME..ACCOUNT_NAME.TABLE_NAME WHERE COLUMN1 = SID;
?
存在的問題是查詢速度非常慢,前臺(tái)報(bào)超時(shí)。所以準(zhǔn)備提升下查詢的性能
2. 分析
首先,確定遠(yuǎn)程Oracle的表在篩選字段上是否存在索引。經(jīng)確認(rèn),存在索引。
然后,在SSMS客戶端中查看了執(zhí)行語句的執(zhí)行計(jì)劃,如下:
從執(zhí)行計(jì)劃可以看出,過程沒有和自己設(shè)想的那樣,原以為SQLServer會(huì)將整個(gè)查詢提交到Oracle服務(wù)器執(zhí)行。而實(shí)際在遠(yuǎn)程查詢時(shí),并沒有加入where條件,而是將結(jié)果返回到本地后,在本地執(zhí)行篩選(有一個(gè)篩選器)
這樣速度肯定會(huì)非常慢,因?yàn)椴樵儧]有使用到索引查找,需要將遠(yuǎn)程數(shù)據(jù)全部傳輸?shù)奖镜睾蟛艌?zhí)行篩選,相當(dāng)于全表掃描,還多了網(wǎng)絡(luò)傳輸?shù)臅r(shí)間。
3. 解決
其實(shí)只要能將帶where條件的查詢語句一并提交到Oracle服務(wù)器執(zhí)行遠(yuǎn)程查詢,就可以解決性能問題了。
但問題是OpenQuery不支持參數(shù)。見微軟MSDN http://technet.microsoft.com/zh-cn/library/ms188427.aspx
但好在我們可以另辟蹊徑,通過拼接動(dòng)態(tài)SQL的方式實(shí)現(xiàn)傳遞查詢參數(shù)。
OpenQuery使用參數(shù)可參考這篇文章: http://www.cnblogs.com/Dannier/archive/2011/09/21/openquery.html
通過這種方式優(yōu)化后,執(zhí)行計(jì)劃變?yōu)槿缦拢嚎梢钥吹綄?shí)際返回的行數(shù)很少了
查詢速度提升明顯,由原來的前臺(tái)超時(shí)到現(xiàn)在的毫秒級(jí)。
小小的得意一下^_^,歡迎拍磚。如有其他方法,求分享,謝謝!
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
