次のクエリは、TOAD (ネイティブの Oracle ドライバーを使用) を使用して Oracle 11 に対して直接実行すると効率的に機能します。
select ... from ... where ...
and srvg_ocd in (
select ocd
from rptofc
where eff_endt = to_date('12/31/9999','mm/dd/yyyy')
and rgn_nm = 'Boston'
) ...
;
を介して SQL Server 2008 から同じ Oracle データベースに渡された場合、まったく同じクエリが返されることはありませんopenquery()
。SQL Server には、Oracle Provider OLE DB ドライバーを使用して Oracle データベースへのリンクがあります。
select * from openquery( servername, '
select ... from ... where ...
and srvg_ocd in (
select ocd
from rptofc
where eff_endt = to_date(''12/31/9999'',''mm/dd/yyyy'')
and rgn_nm = ''Boston''
) ...
');
妥当な時間内にクエリが返されず、ユーザーがクエリを強制終了します。最終的に正しい結果が返されるかどうかはわかりません。
直接の TOAD クエリが効率的に機能し、openquery()
バージョンが「決して」返されないこの結果は再現可能です。
を少し変更するとopenquery()
、正しい効率的な結果が得られます。 に変更eff_endt
しtrunc(eff_endt)
ます。
それは良いことですが、変更が必要なようには見えません。
openquery()
TOAD とopenquery()
動作にどのような違いがあるのでしょうか?
私たちが気にする理由は、Oracle に直接アクセスする TOAD を使用して複雑なクエリを頻繁に開発するためです。クエリが機能して最適化されたらopenquery()
、SQL Server アプリケーションで使用する文字列に変換します。openquery()
クエリが直接クエリとして機能していることがわかっているときに、クエリが突然失敗することは非常に厄介です。次に、試行錯誤しながら回避策を探す必要があります。
2 つのシナリオの Oracle トレース ファイルを確認したいのですが、Oracle サーバーは別の組織内にあり、Oracle DBA から協力を得られません。
ドライバー、TOAD、または???を知っている人はいますか?不一致を説明できる問題はありますか?両方の方法で常に同じ結果が得られるように問題を解決する方法はありますか?