0

以下の場合の SQL Server の動作を理解しようとしています。

SQL Server で作成されたリンク サーバーを使用して、Oracle から SQL Server 2005 データベースに約 50 万行をフェッチしています。クエリに約 50 の奇数列を使用していInsert Into selectます。

クエリが終了せず、手動で停止するまで無期限に実行されていたことがわかりました。しかし、宛先テーブルを確認すると、約1時間後にテーブル内の行を見つけることができました。ただし、クエリの実行は停止せず、宛先テーブルの排他ロックも解除されませんでした。

Oracle リンク サーバーで単純なクエリを実行したとき、Oracle と SQL Server のデータ型の一部を明示的に変換する必要があることがわかりました (特に Oraclenumericから SQL Server へVarchar)。

この問題が発生したすべてのデータ型が明示的に変換された後、クエリが正常に停止し、テーブルの排他ロックが解放されるなど、問題なくフェッチ全体を完了することができました。

私が持っている質問は、クエリでデータ型変換の問題があるにもかかわらず、クエリがすべてのデータをフェッチしたのはなぜですか?また、すべてのデータをフェッチした後でもロックを保持したのはなぜですか? これに対する説明は非常に高く評価されます(問題は解決されていますが:))

4

1 に答える 1

1

MS SQL は、さまざまなロック、行、列、テーブルを使用します。おそらくロックをテーブルにエスカレートしました。また、そうしないように指示しない限り、行の挿入ごとに関連する各インデックスも更新します。これには 2 つの方法があります: バッチで行を挿入します。たとえば、1000 または 10000 とします。実験して、列幅に適したバッチ サイズを見つけてください。または、インデックスを無効にします (そして、それらを再度有効にすることを忘れないでください)。MSSQL は、選択全体に対してすべての型変換を 1 つで行う必要があり、おそらく tempdb またはメモリを使用するため、そこに制限がある場合、これも速度が低下します: メモリ スワップ ファイルなどですが、バッチで行うとこれがなくなりますボトルネック。また、各挿入は暗黙的なトランザクションになります。一貫性を保つために、SQL はロールバックできる必要があります...これをすべてログ ファイルに書き込むことを忘れないでください。

于 2013-03-21T11:32:46.883 に答える