Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
工作台提供了一些一致性。top 5在一个事务中检索,就像快照一样。如果没有工作表,您可能会得到一个top 5,其中包含从未同时出现在表中的行。@Andomar-可能是这样的。在这种情况下,我使用的是一个本地#temp表,因此SQL Server(可能)会意_Sql_Sql Server_Sql Server 2008_Cursor_Database Performance - Fatal编程技术网

工作台提供了一些一致性。top 5在一个事务中检索,就像快照一样。如果没有工作表,您可能会得到一个top 5,其中包含从未同时出现在表中的行。@Andomar-可能是这样的。在这种情况下,我使用的是一个本地#temp表,因此SQL Server(可能)会意

工作台提供了一些一致性。top 5在一个事务中检索,就像快照一样。如果没有工作表,您可能会得到一个top 5,其中包含从未同时出现在表中的行。@Andomar-可能是这样的。在这种情况下,我使用的是一个本地#temp表,因此SQL Server(可能)会意,sql,sql-server,sql-server-2008,cursor,database-performance,Sql,Sql Server,Sql Server 2008,Cursor,Database Performance,工作台提供了一些一致性。top 5在一个事务中检索,就像快照一样。如果没有工作表,您可能会得到一个top 5,其中包含从未同时出现在表中的行。@Andomar-可能是这样的。在这种情况下,我使用的是一个本地#temp表,因此SQL Server(可能)会意识到它无论如何都是一致的,因为其他事务无法修改它。我还尝试了设置事务隔离级别readuncommitted,但仍然看到相同的结果。(并且设置行数5也保持两个计划不变)对于顶部。。。ORDER BY可以通过遵循索引来满足,通常结果不会缓冲在假脱机


工作台提供了一些一致性。
top 5
在一个事务中检索,就像快照一样。如果没有工作表,您可能会得到一个
top 5
,其中包含从未同时出现在表中的行。@Andomar-可能是这样的。在这种情况下,我使用的是一个本地
#temp
表,因此SQL Server(可能)会意识到它无论如何都是一致的,因为其他事务无法修改它。我还尝试了
设置事务隔离级别readuncommitted
,但仍然看到相同的结果。(并且
设置行数5也保持两个计划不变)对于
顶部。。。ORDER BY
可以通过遵循索引来满足,通常结果不会缓冲在假脱机或其他内容中。只需将
TOP
迭代器添加到计划中,该迭代器计算行数,并在达到目标时停止向子迭代器请求行。对于常规(非游标)查询,除非处于可序列化或快照隔离级别,否则不会尝试在查询中间插入或删除行,并且如果在扫描中间移动同一行,则可能会读取同一行两次。不确定为什么带有
TOP
的游标需要更严格的语义?游标和普通查询之间的区别在于,普通查询在迭代时无法执行其他DML语句。当您使用光标时,您可以。这些DML语句可能会影响排名靠前的顺序。这是一个很好的观点(+1)。这可能是一种万圣节保护问题。此外,如果没有订单,主要的事情是更新(可以锁定,直到你通过物理行或页面)。这意味着,只要您在游标中流动,表就可以逐步解锁。对于ORDER BY,情况并非如此,在关闭光标之前,您可能需要一个广泛的表或索引锁,否则可能会得到不一致的结果。当您在1000行表上执行前5名时,这就是您想要的,因此查询优化器可能会决定最好提前创建快照,这样它就可以只锁定选定的行。@Parmenion-您绝对不能依赖隐式的
order by
。如果您使用
DISTINCT
,您可能会看到您描述的行为是排序操作的人工制品,但没有任何保证,因为它可能会使用散列聚合。对于其他查询,由于所使用的访问方法,您可能会注意到顺序是索引键顺序,但同样,您不能依赖于此,因为并行、IAM顺序扫描或旋转木马扫描都可能会改变这种观察到的行为。如果您需要订购人
,请明确指定。谢谢。关于游标内部的信息似乎很难获得!
SET @C2 = CURSOR DYNAMIC TYPE_WARNING FOR SELECT TOP ...
SET STATISTICS IO OFF

CREATE TABLE #T ( ord INT IDENTITY PRIMARY KEY, total INT, Filler char(8000))

INSERT INTO #T (total) VALUES (37),(80),(55),(31),(53)

DECLARE @running_total INT, 
    @ord INT, 
    @total INT
    
SET @running_total = 0
SET STATISTICS IO ON
DECLARE @C1 AS CURSOR;
SET @C1 = CURSOR FAST_FORWARD FOR SELECT ord, total FROM #T ORDER BY ord;
OPEN @C1;
PRINT 'Initial FETCH C1'
FETCH NEXT FROM @C1 INTO @ord, @total ;
WHILE @@FETCH_STATUS = 0
BEGIN
  SET @running_total = @running_total + @total
  PRINT 'FETCH C1'
  FETCH NEXT FROM @C1 INTO @ord, @total ;
END

SET @running_total = 0
SET STATISTICS IO ON
DECLARE @C2 AS CURSOR;
SET @C2 = CURSOR FAST_FORWARD FOR SELECT TOP 5 ord, total FROM #T ORDER BY ord;
OPEN @C2;
PRINT 'Initial FETCH C2'
FETCH NEXT FROM @C2 INTO @ord, @total ;
WHILE @@FETCH_STATUS = 0
BEGIN
  SET @running_total = @running_total + @total
  PRINT 'FETCH C2'
  FETCH NEXT FROM @C2 INTO @ord, @total ;
END

PRINT 'End C2'
DROP TABLE #T