NOBTAの気ままにITブログ

Azure全般 / SQL Serverに関する情報を発信していきます。


スポンサーリンク

【Tips】Oracle Provider for OLEDB リンクサーバー経由でクエリを実行する場合のベストプラクティス 【保存版】


スポンサーリンク

SQL Server から Oracle などの SQL Server 以外のデータベースに対してリンクサーバー経由でクエリを実行する場合、最適なクエリの実行プランが生成できず、リンクサーバー先のテーブルから全件データを SQL Server 側で受信後、SQL Server 側でフィルター処理が行われるなど、リンクサーバー経由のクエリのパフォーマンスが低下するといった現象が発生する場合があります。

そのため、SQL Server 以外のデータベースに対してリンクサーバー経由でクエリを実行する場合、OPENQUERY を使用することが推奨されています。

OPENQUERY を使用することにより、例えば、リンクサーバー先が Oracle の場合、OPENQUERY によりOracle 側に実行されるクエリ情報が送信され、Oracle 側のオプティマイザによりクエリの構文解析、実行プランの生成が行われるため、最適なクエリの実行プランにより Oracle 側でクエリが実行されることで、リンクサーバー経由のクエリのパフォーマンスを向上できることが期待できます。

今回は、OPENQUERY を使用して、SQL Server 以外のデータベースに対してリンクサーバー経由でクエリを実行する方法について紹介したと思います。

 

 

 

SQL Server 以外のデータベースに対してリンクサーバー経由でQPENQUERYを使用したクエリを実行する方法について

SELECT クエリ
SELECT * FROM OPENQUERY (<リンクサーバー名>. '<クエリ内容>');

 

[クエリ実行例] 

SELECT * FROM OPENQUERY (ORA, 'select * from oradmin.tab1');

 

UPDATE クエリ 
UPDATE OPENQUERY (<リンクサーバー名>. '<クエリ内容>')  
SET <更新する列名> = '<更新する値>'

 

[クエリ実行例] 

UPDATE OPENQUERY (ORA, 'SELECT c1 FROM oradmin.tab1 WHERE c1 = 1')  
SET c1 = 2;  

 

INSERT クエリ 
INSERT OPENQUERY (<リンクサーバー名>, '<クエリ内容>'
VALUES (<挿入値>); 

 

[クエリ実行例] 

INSERT OPENQUERY (ORA, 'SELECT c1 FROM oradmin.tab1'
VALUES (1); 

 

DELETE クエリ 
DELETE OPENQUERY (<リンクサーバー名>, '<クエリ内容>');  

 

[クエリ実行例] 

DELETE OPENQUERY (ORA, 'SELECT c1 FROM oradmin.tab1 WHERE c1 = 2');  

 

まとめ

今回は、SQL Server 以外のデータベースに対してリンクサーバー経由でQPENQUERYを使用したクエリを実行する方法について紹介してみました。

SQL Server から Oracle へのリンクサーバーを設定する方法については、前回のブログを参照してもらえればと思います。