web-dev-qa-db-ja.com

SQL Server:ODBC Oracleにリンクされたサーバーがすべての行を返さない

片側に1つのSQL Serverインスタンスがあるとします。

  • SQL Server 2008 R2 SP3
  • ODBC用OLEDBドライバーと共にインストールされたOracle 11.2クライアント

..もう一方の側のOracleデータベースインスタンス:

  • Oracleデータベース11.1.0.7 PSU 24
  • インスタンス名:MERCURE

SQL Serverインスタンスに2つのデータベースリンクを作成しました。

  1. MERCURE(ODBCサーバーDSNおよびMSDASQLプロバイダーを使用)
  2. MERCURE_OLE(OraOLEDB.Oracleを使用)

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の使用など)に多くの変更を加えました。何も機能しませんでした。

どんな手掛かり ?

3

マイクロソフトはSQL Server 2014の累積的な更新4でこの問題を修正しました。

https://support.Microsoft.com/help/2993262/

アップデートをインストールできない場合は、回避策を提供します。

この問題を回避するには、マージ結合の代わりにオプションコマンドを使用して、ネストされたループ結合またはハッシュ結合を使用します。

1
Sankar