SQL Server 2k5是否保留链接服务器上的锁定提示?

时间:2009-08-27 23:00:40

标签: sql sql-server sql-server-2005

我一直在努力 - 而且我自己也不是DBA,但在尝试解决在链接服务器上执行外部联接的特别昂贵(且不常见)的查询时遇到了好奇(2k5到2k5,不同物理机器上的不同dbs)。这个问题通常似乎不是执行时间,而是锁定,因为外连接是针对db的非常大量读取/写入的,并且想知道是否在连接语句中添加NOLOCK提示是徒劳的。

我已经找到了this MSDN Social link(并检查了现有的SO问题),但主持人猜测了一件事(提示没有通过电汇传递),然后提问者凭经验证明他正在看到提示保存。我想这样可以帮助我找到更确定的答案!

2 个答案:

答案 0 :(得分:3)

我刚刚使用NOLOCK提示在您描述的场景(2k5到2k5,不同物理机器上的不同dbs)上对此进行了测试,其中SQL Profiler在链接服务器指向的机器上运行。跟踪显示在链接服务器上执行的查询中保留了提示

我跑了

select 1 from server.master.dbo.sysobjects with (nolock)

并在跟踪中找到以下内容:

declare @p1 int
set @p1=4
exec sp_prepexec @p1 output,NULL,N'SELECT (1) "Expr1003" FROM "master"."dbo"."sysobjects" "Tbl1002" WITH (NOLOCK)'
select @p1

我怀疑这是SQLNCLI驱动程序的一个功能,是SQL 2005的新功能,因为SQL 2000中的链接服务器查询中肯定没有保留提示。

在您的查询中尝试NOLOCK提示可能是值得的,尽管您需要知道您可能从查询执行时正在更新的行中获取脏数据。这可能是也可能不是问题,具体取决于您的数据使用方式。

答案 1 :(得分:1)

很好的问题,我将继续并且实际上没有回答它并说你应该考虑在数据库中将READ_COMMITTED_SNAPSHOT设置为ON。这将阻止使用READ_COMMITTED隔离级别的事务默认阻止。但是,在设置它之前,您需要阅读该设置,因为您需要了解负载配置文件是什么样的,并且您的DBA必须确保相应地调整tempdb的大小。