我正在对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 :(得分:0)
我会尝试使用循环而不是CURSOR。游标效率非常低,并且由于它们的工作原理,没有太多方法可以优化游标,你也使用全表扫描,因为它必须对你来的每条记录进行全表扫描因为游标的工作方式。我会尝试使用while循环,看看这是否有助于你的时间。我还会尝试在SQL语句中添加一个where子句。