2016-07-06 29 views
-1

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ステートメントを破棄してカーソルの次の繰り返しに移動できますか?

+0

あなたは 'EXISTS'を使ってみましたか?これは、違いを検出して行を返さないことだけを前提としています。 – HABO

+0

述語なしで '*'を選択しています。どのようなインデックスですか?どのような「パフォーマンス」ですか? –

+0

実際には、Sybase ASA、Oracle、またはIngresに同じテーブル名、カラム名、データタイプ、および同じ順序でサーバをリンクしています。 – Paparazzi

答えて

0

私は、CURSORの代わりにループを使用しようとします。カーソルは非常に非効率的であり、カーソルがどのように機能するかによってカーソルを最適化する方法はあまりなく、フルテーブルスキャンを使用しているため、来るレコードごとにフルテーブルスキャンを行う必要があるため、カーソルはどのように動作するのかがわかります。私はwhileループを使用して、それがあなたの時間に役立つかどうかを調べることに目を向けるでしょう。また、SQL文にwhere句を追加しようとします。

関連する問題