SQL Serverデータベースとリンクサーバーデータベース(指定したリンクサーバーによってSybase ASA、OracleまたはIngres)間でデータ比較を行っています。EXCEPTステートメントのパフォーマンスを向上させる
私は各データベース内のすべてのテーブルをループして、例外を実行するカーソルを持っています。
OPEN MY_Cursor;
FETCH NEXT FROM MY_Cursor INTO @TableName;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT * FROM OPENQUERY([LINKEDSERVER],'SELECT * FROM @TableName')
EXCEPT
SELECT * FROM @TableName
IF @@ROWCOUNT <> 0
BEGIN
PRINT @TableName
END
FETCH NEXT FROM My_Cursor INTO @TableName
END
これは完全なテーブルスキャンを実行しており、すべての行が比較されるまで結果が返されません。これらのテーブルの中には何百万もの行があるため、これには非常に長い時間がかかります。
実行計画は、パフォーマンスの問題の約95%がリモートエンドにあることを示しています。残念ながら、リンクされたサーバーデータベースでインデックスまたはインデックス付きのビューを作成する権限がありません。
データの差があるレコードが見つかると、exceptステートメントを破棄してカーソルの次の繰り返しに移動できますか?
あなたは 'EXISTS'を使ってみましたか?これは、違いを検出して行を返さないことだけを前提としています。 – HABO
述語なしで '*'を選択しています。どのようなインデックスですか?どのような「パフォーマンス」ですか? –
実際には、Sybase ASA、Oracle、またはIngresに同じテーブル名、カラム名、データタイプ、および同じ順序でサーバをリンクしています。 – Paparazzi