我有一个 SQL Server 2008 数据库SET ALLOW_SNAPSHOT_ISOLATION ON
和一个带有列 ID(主键)和 SSN(唯一非聚集索引)的 Person 表。
数据库中的其中一行是 ID = 1,SSN = 776-56-4453。
一对一连接,发生这种情况:
set transaction isolation level snapshot
begin transaction snapshot
while (1 = 1) select * from person where SSN = '777-77-7777'
然后在另一个连接上:
update person set SSN = '555-55-5555' where ID = 1
正如预期的那样,即使在第二个连接完成执行后,第一个连接仍将 SSN 显示为“777-77-7777”。第一个连接的执行计划在 SSN 上显示“聚集索引搜索”,但是如果另一个连接上的索引键已更新,第一个连接如何继续使用该索引?
SQL Server 是否会做任何特别的事情来保持索引的多个版本以适应这种情况?
我试图了解快照隔离级别的性能特征,因此想确认 SQL Server 足够聪明,即使在从行的先前版本中检索过时数据时也可以使用现有索引。