我有这个查询
UPDATE linkeddb...table SET field1 = 'Y' WHERE column1 = '1234'
选择并更新一行需要23秒
但如果我使用openquery(我不想这样做)那么它只需要半秒钟。
我不想使用openquery的原因是我可以安全地为查询添加参数,并且可以安全地进行SQL注入。
有谁知道它运行这么慢的任何原因?
答案 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?或者这只是你问题中的拼写错误?