代码之家  ›  专栏  ›  技术社区  ›  Jamie Taylor

连接到链接服务器时查询速度慢

  •  8
  • Jamie Taylor  · 技术社区  · 14 年前

    我有这个问题

    UPDATE linkeddb...table SET field1 = 'Y' WHERE column1 = '1234'

    选择并更新一行需要23秒

    但是如果我使用openquery(我不想使用),那么只需要半秒钟。

    我不想使用openquery的原因是,这样我就可以安全地向查询中添加参数,避免SQL注入。

    有人知道它跑得这么慢的原因吗?

    4 回复  |  直到 14 年前
        1
  •  9
  •   Joe Stefanelli    14 年前

    这里有一个替代的想法。在远程服务器上创建存储过程以执行更新,然后从本地实例调用该过程。

    /* On remote server */
    create procedure UpdateTable
        @field1 char(1),
        @column1 varchar(50)
    as
        update table
            set field1 = @field1
            where column1 = @column1
    go
    
    /* On local server */
    exec linkeddb...UpdateTable @field1 = 'Y', @column1 = '1234'
    
        2
  •  4
  •   Community CDub    8 年前

    如果你在找 为什么? ,这里有一个可能性 Linchi Shea's Blog :

    在以下情况下创建最佳查询计划 您正在使用链接的 服务器,查询处理器必须具有 数据分布统计来自 链接服务器。限制了 对的任何列的权限 桌子可能不够 获得所有有用的 统计数据,可能会收到亚历斯 高效的查询计划和经验 表现不佳。如果链接 服务器是SQL Server的一个实例,用于 获取所有可用的统计信息 用户必须拥有表或是成员 在sysadmin固定服务器角色中 数据库所有者固定数据库角色,或 数据库ddladmin修复了 链接服务器。

    (由于Linchi的帖子,这个澄清被添加到最新的BooksOnline SQL文档中)。

    换言之,如果链接服务器是由具有有限权限的用户设置的,则SQL无法检索表的准确统计信息,并且可能会选择执行查询(包括检索所有行)的糟糕方法。

    这是一个 related SO question 关于链接服务器查询性能。他们的结论是:使用OpenQuery获得最佳性能。

    更新:一些 additional excellent posts 关于Linchi博客中的链接服务器性能。

        3
  •  2
  •   Arvo    14 年前

    列1是主键吗?可能不是。尝试使用主键选择要更新的记录(其中PK_field=xxx),否则(有时?)将读取所有记录以查找要更新的记录的主键。

        4
  •  1
  •   Tim    14 年前

    第1列是varchar字段吗?这就是为什么用单引号将1234值括起来的原因吗?或者这只是你问题中的一个打字错误?