提高EXCEPT语句的性能

时间:2016-07-06 23:06:53

标签: sql-server tsql

我正在对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语句并在找到任何有数据差异的记录后立即进入游标的下一次迭代?

1 个答案:

答案 0 :(得分:0)

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