我读这篇文章是为了了解在Server:http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/中是如何做到的
如果我正确理解它,数据将按需要发送到客户端。在向客户端获取下一批数据之前,查询的执行将暂停。如果我们进行范围扫描,那么关于最后返回的行的元数据将存储在某个地方。在此期间,如果有一个分页,并且最后返回的行在新页上,会发生什么情况?这个是可能的吗?这个操作符/迭代器(例如聚集索引扫描)是否一直保存在页面上的锁存器?这将非常低效,所以Server必须有其他方法来保持它的同步吗?
我的问题是-存储哪些元数据以及Server如何保持其同步?
发布于 2014-12-25 20:41:56
没有Server不保存锁存器。存储引擎使用"cookie“跟踪当前索引扫描位置。如果另一个进程在获得cookie后在同一页上使用锁存(其类型意味着页面可能已被更改),则cookie将重新验证。
如果cookie (扫描位置)不再有效,则遍历b树结构(使用存储在cookie中的键+单位信息)以重新获取正确的位置,并更新cookie。
如果感兴趣,下面是验证保存位置时的堆栈捕获:

另一个在cookie验证之后,由于并发的不兼容锁存而失败。引擎正在使用一个查找来重新定位扫描位置,以找到正确的新位置:

有一些与cookie活动相关的性能计数器,例如Scan Point Revalidations/sec和Used page/leaf page cookie。
没有公共文档能够准确地描述这一切是如何工作的。上面的细节是基于观察,随后在与保罗兰德尔和鲍勃沃德的谈话中得到证实。
发布于 2014-12-25 16:15:46
总的来说,数据库元数据和您插入/select/update/delete的用户数据通常受到事务、隔离级别、闩锁和锁的保护。
因为您的问题是关于元数据的,所以一个简单的例子:
如果这不足以满足您的问题:“存储了哪些元数据,以及Server如何保持其同步?”然后,我建议阅读以下书籍:
Microsoft SQL Server 2008内部程序(开发人员参考),作者: Kalen Delaney、Paul Randal、金伯利·特里普、康诺·坎宁安、亚当·马查尼和本杰明·内瓦雷斯。(所有Server引擎。)一个链接,如果你需要的话:
http://www.amazon.com/Microsoft-Server-Internals-Developer-Reference/dp/0735626243/
https://dba.stackexchange.com/questions/87001
复制相似问题