片側に1つのSQL Serverインスタンスがあるとします。
..もう一方の側のOracleデータベースインスタンス:
SQL Serverインスタンスに2つのデータベースリンクを作成しました。
Oracleインスタンス(インスタンス名MERCURE
)で、次のようにスキーマとテーブルを作成しました。
CREATE USER JEL_PERF_TST identified by "XXX";
GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE to JEL_PERF_TST;
ALTER SESSION SET CURRENT_SCHEMA=JEL_PERF_TST;
-- select DEFAULT_TABLESPACE from dba_users where username='JEL_PERF_TST';
-- USERS
-- create a table for testing (Taken from https://use-the-index-luke.com/sql/example-schema/Oracle/3-minute-test)
CREATE TABLE TestTbl (
id NUMERIC NOT NULL,
date_column DATE,
a NUMERIC,
b NUMERIC,
text VARCHAR(255),
state CHAR(1),
PRIMARY KEY (id)
);
INSERT INTO TestTbl
SELECT level
, SYSDATE - level
, MOD(level,1234)
, TRUNC(DBMS_RANDOM.VALUE(1, 10))
, DBMS_RANDOM.STRING('l', 20)
, DECODE(MOD(level, 5), 'X', 'A')
FROM dual
CONNECT BY level <= 50000;
つまり、基本的に、テーブルには50.000行あります。次に、SQL Serverインスタンスで次のクエリを実行します。
最初に、統計をアクティブにします。
set statistics io on;
set statistics time on;
次に、OraOLEDB.Oracle
プロバイダーを使用して最初のクエリを実行します。
SELECT * FROM [MERCURE_OLE]..[JEL_PERF_TST].[TESTTBL];
ここに私が得たものがあります:
SQL Server parse and compile time:
CPU time = 32 ms, elapsed time = 274 ms.
(50000 row(s) affected)
SQL Server Execution Times:
CPU time = 2199 ms, elapsed time = 5769 ms.
パフォーマンスはあまり良くありませんが(1行で8.5 ms以上)、ここでは問題になりません。 100%の行が返されました。
OPENQUERYと同じリンクサーバーを使用してクエリを実行してみましょう。
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 103 ms.
(50000 row(s) affected)
SQL Server Execution Times:
CPU time = 2542 ms, elapsed time = 6716 ms.
ここでも同じですが、パフォーマンスは悪いですが、100%の行が返されます。
次に、まったく同じクエリを実行しますが、MSDASQLプロバイダーを使用します。
select * from openquery(MERCURE,'select * from JEL_PERF_TST.TestTbl');
その結果:
SQL Server parse and compile time:
CPU time = 15 ms, elapsed time = 107 ms.
(**49901** row(s) affected)
SQL Server Execution Times:
CPU time = 1357 ms, elapsed time = 3932 ms.
タイミングは優れていますが、99行が不足している行はどこですか?
ODBC接続記述子(結果セットの有効化/無効化、フェッチバッファーサイズの増加、MSDTCの使用など)に多くの変更を加えました。何も機能しませんでした。
どんな手掛かり ?
マイクロソフトはSQL Server 2014の累積的な更新4でこの問題を修正しました。
https://support.Microsoft.com/help/2993262/
アップデートをインストールできない場合は、回避策を提供します。
この問題を回避するには、マージ結合の代わりにオプションコマンドを使用して、ネストされたループ結合またはハッシュ結合を使用します。