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 へのリンクサーバーを設定する方法については、前回のブログを参照してもらえればと思います。