2016-07-06 62 views
-1

我在SQL Server數據庫和鏈接服務器數據庫(Sybase ASA,Oracle或Ingres,取決於指定的鏈接服務器)之間進行數據比較。提高EXCEPT語句的性能

我有一個遊標,循環遍歷每個數據庫中的所有表,並做一個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子句。