2016-07-06 71 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子句。