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

时间:2010-11-18 11:16:06

标签: asp.net sql sql-server linked-server openquery

我有这个查询

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

选择并更新一行需要23秒

但如果我使用openquery(我不想这样做)那么它只需要半秒钟。

我不想使用openquery的原因是我可以安全地为查询添加参数,并且可以安全地进行SQL注入。

有谁知道它运行这么慢的任何原因?

4 个答案:

答案 0 :(得分:9)

这是一种思考作为替代方案。在远程服务器上创建存储过程以执行更新,然后从本地实例调用该过程。

/* 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'

答案 1 :(得分:4)

如果您正在寻找为什么,可以从Linchi Shea's Blog开始:

  

创建最佳查询计划时   你在链接上使用表   服务器,查询处理器必须具备   来自的数据分布统计   链接服务器。有限的用户   任何列的权限   表可能没有足够的   获得所有有用的权限   统计,并可能得到无奈   高效的查询计划和经验   表现不佳。如果链接   server是SQL Server的一个实例   获取所有可用的统计数据   用户必须拥有该表或成为成员   sysadmin固定服务器角色,   db_ownerfixed数据库角色,或者   db_ddladmin修复了数据库角色   linkedserver。

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

换句话说,如果使用权限有限的用户设置链接服务器,则SQL无法检索表的准确统计信息,并且可能选择执行查询的不良方法,包括检索所有行。 / p>

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

column1是varchar字段吗?这就是为什么你用单引号围绕值1234?或者这只是你问题中的拼写错误?