【问题标题】:Link Server Optimization Help链接服务器优化帮助
【发布时间】:2010-12-07 11:13:34
【问题描述】:

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

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% 的成本。

任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server tsql triggers linked-server


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 这只是导致延迟的触发器的一部分。我已经在检查以确保只有一条记录被更新或插入。在第二台服务器上设置作业不是一种选择,同步需要实时进行。
      猜你喜欢
      • 2015-02-16
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多