使用鏈結伺服器在異構資料庫中查詢資料

2021-09-05 19:20:50 字數 1644 閱讀 3768

sql server提供了鏈結伺服器用於分布式查詢異構資料庫。通過鏈結伺服器可以鏈結到oracle、sybase、db2、sql server等大型關聯式資料庫,也可以連線到access、excel等檔案資料庫,甚至可以連線到目錄服務(ad)、索引服務等。要鏈結到一種資料庫需要使用相應的介面。微軟為很多資料庫提供了驅動介面,所以可以直接使用,但是對於沒有提供驅動的資料庫比如sybase,則需要在伺服器上安裝對應資料庫廠商提供的驅動。

[伺服器名].[資料庫名].[架構名].[物件名]

的形式來訪問資料庫。例如要訪問oracle資料庫中的乙個表,則對應的查詢語句是:

select

*from

ora..mary.orders

where

ordercode='

20080808008'

其中ora是鏈結伺服器名,mary是使用者架構名,orders是表或檢視名。執行查詢sql server將返回查詢的結果。

但是當oracle中的這個表資料量較大,比如有幾十萬行或者幾百萬行時,這個查詢將會耗費很長時間。在sql server中執行該指令碼可能要等上10秒、20秒或者1分鐘、5分鐘才可能查詢出結果。但是如果將指令碼在oracle伺服器上直接執行,則1秒鐘不到就查詢出結果了。造成這種情況的是sql server查詢鏈結伺服器的機制。

不同的資料庫對應的sql語言是有所不同的。而對於oracle資料庫,通過鏈結伺服器查詢資料時,sql server為了保證t-sql語句能夠正常使用,但是oracle資料庫可能不認識這些t-sql語句,所以sql server將會把查詢中所用到的oracle表資料從oracle資料庫讀出來,一直到滿足查詢條件為止。對於**16.18中的查詢,sql server會將oracle資料庫中的orders表全部讀取到sql server資料庫中,一邊讀取一邊查詢ordercode = '20080808008'的資料,直到全部資料讀取完為止。對於上十萬百萬級的資料表來說,全部讀取資料當然會造成系統緩慢。如果將上面的查詢修改為如下的方式,則可能速度會快上很多。

top1

*from

ora..mary.orders

where

ordercode='

20080808008'

這是因為sql server從oracle中順序的讀取orders 表,一邊讀取一邊比較ordercode='20080808008'一旦查詢到了結果,由於我們寫了top 1,所以系統判斷滿足條件了,就將結果返回,而不需要再繼續向oracle讀取剩下的資料。但是這樣做按照概率來說也要查一半的資料才能找到結果,仍然很慢。

sql server為了解決這個問題,提供了openquery函式用於將查詢語句直接送到鏈結伺服器中,由鏈結伺服器的資料庫引擎負責查詢,而不是由sql server將全部資料讀取到本地來查詢。openquery函式的語法格式為:

openquery ( linked_server ,'query' )

select

*from

openquery

(ora,

'select * from mary.orders where ordercode=

''20080808008

''')

這樣條件查詢將會在oracle資料庫中執行,oracle將查詢的結果返回給sql server,然後sql server再將結果返回給使用者。

使用鏈結伺服器在異構資料庫中查詢資料

sql server提供了鏈結伺服器用於分布式查詢異構資料庫。通過鏈結伺服器可以鏈結到oracle sybase db2 sql server等大型關聯式資料庫,也可以連線到access excel等檔案資料庫,甚至可以連線到目錄服務 ad 索引服務等。要鏈結到一種資料庫需要使用相應的介面。微軟為很...

node 建立伺服器 鏈結資料庫

1.配置伺服器 引入 http模組 鏈結資料庫 mongoose.connect mongodb localhost students then console.log 資料庫鏈結成功 catch console.log 資料庫鏈結失敗 建立 伺服器 createserver 當客戶端訪問伺服器端的...

建立資料庫伺服器遠端鏈結(MSSQL)

建立鏈結伺服器 exec sp addlinkedserver server pp client 鏈結伺服器名 srvproduct provider n sqloledb datasrc n 117.135.132.71 遠端伺服器名稱 catalog n uims go 建立遠端登入 exec ...