0

我在触发器中有这段代码。

if isnull(@d_email,'') <> isnull(@i_email,'')
 begin
 update server2.database2.dbo.Table2
 set
 email = @i_email,
 where user_id = (select user_id from server2.database2.dbo.Table1 where login =  @login)
 end

我想更新另一个数据库服务器上的表,两者都是 MSSQL。上面的查询对我有用,但需要 10 多秒才能完成。table2 有超过 20 万条记录。当我运行执行计划时,它说远程扫描有 99% 的成本。

任何帮助,将不胜感激。

4

2 回答 2

1

首先,显而易见的。检查链接服务器上的索引。如果我在没有链接服务器问题的情况下看到这个问题,那将是我要检查的第一件事。

建议:不要在服务器1触发器中嵌入UPDATE,而是在链接服务器上创建一个存储过程,并通过调用该存储过程来更新记录。

尝试从 UPDATE 中删除子查询:

if isnull(@d_email,'') <> isnull(@i_email,'')
begin
    update server2.database2.dbo.Table2
       set email = @i_email
      from server2.database2.dbo.Table2 t2
           inner join
           server2.database2.dbo.Table1 t1
           on (t1.user_id = t2.user_id)
     where t1.login = @login
end
于 2009-10-16T20:06:40.807 回答
0

哇,坏触发器!永远不要,我的意思是永远不要写触发器,假设只有一条记录将被插入/更新或删除。您不应该在触发器中以这种方式使用变量。触发器对一批数据进行操作,如果您假设一条记录,您将在数据库中产生完整性问题。

您需要做的是加入插入的表,而不是使用变量作为值。

在触发器中,真正更新到远程服务器也可能不是一个好主意。如果远程服务器出现故障,那么您将无法向原始表插入任何内容。如果数据可能比实时数据少一些,通常的技术是让触发器转到同一服务器上的表,然后作业每 5-10 分钟获取一次新信息。这样,如果远程服务器关闭,记录仍然可以插入并存储,直到作业可以将它们拾取并将它们发送到远程服务器。

于 2009-10-16T18:33:13.347 回答