请各位赐教!!郁闷了好几天[汗]
环境:D6+SQL Server2000+TADOQuery
数据表说明:Field1和Field2是主健,在Field1是聚集索引字段
在执行
with qryTest do
begin
Sql.Text:='Select Field1, Field2, Sum(Field3) from test where field1=''AA'' AND Field2=''xx'' group by field1, field2 ';
open;
end;时,在事件探查里发现在执行完
exec sp_prepexec @P1 output, NULL, N'Select Field1, Field2, Sum(Field3) from test where field1=''AA'' AND Field2=''xx'' group by field1, field2 
后还有
4、Audit Login -- ?为什么?客户请求一个与运行 SQL Server的服务器的连接
5、SET NO_BROWSETABLE ON  --?怎么会有锁表的操作??
6、declare @P1 int set @P1=1 exec sp_prepare @P1 output, NULL, N'SELECT * FROM test', 1 select @P1  --??
7、Audit Logout  -- CPU高达62016 为什么会发生新的断开连接事件
8、Audit Login     -- ??
9、exec [TEST]..sp_primary_keys_rowset N'test', NULL
10、Audit Logout -- CPU高达62016
=======
当把SQL语句换成
'Select Field1, Field2, Sum(Field3) from test(NoLock) where field1=''AA'' AND Field2=''xx'' group by field1, field2 ';
时,后面的4~10步就不会出现,速度大大的提高,是何原因呀?一个SELECT语句怎么会锁表呢?加上(NoLock)有什么影响吗?怎么又会发生4~10步的事件呢??

解决方案 »

  1.   

    sqlserver帮助
    NOLOCK:不要发出共享锁,并且不要提供排它锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。有可能发生脏读。仅应用于 SELECT 语句。如果表(包括系统表)中包含计算列,而这些计算列由访问其它表中的列的表达式或函数计算而得,则不在那些表上使用表提示(不传播表提示)。例如,在查询中的表上指定 NOLOCK 表提示。该表包含由访问另一表中的列的表达式和函数组合计算到的计算列。这些由表达式和函数引用的表在被访问时并不使用 NOLOCK 表提示。
      

  2.   

    谢谢logne() !我是看到有SET NO_BROWSETABLE ON才查的SQL Server帮助,用的NOLOCK,只是还不是很理解,以前没用过,不知道改成这样有什么影响??是因为有SUM()函数,SQL Server才自动锁表吗?可为什么会有exec [TEST]..sp_primary_keys_rowset N'test', NULL和exec [TEST]..sp_indexes_rowset N'test', NULL, NULL两句,获取表的主健列和索引列有什么用呢??又为什么会断开连接呢?