首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使迭代器保持一致状态

使迭代器保持一致状态
EN

Database Administration用户
提问于 2014-12-25 14:16:47
回答 2查看 247关注 0票数 5

我读这篇文章是为了了解在Server:http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/中是如何做到的

如果我正确理解它,数据将按需要发送到客户端。在向客户端获取下一批数据之前,查询的执行将暂停。如果我们进行范围扫描,那么关于最后返回的行的元数据将存储在某个地方。在此期间,如果有一个分页,并且最后返回的行在新页上,会发生什么情况?这个是可能的吗?这个操作符/迭代器(例如聚集索引扫描)是否一直保存在页面上的锁存器?这将非常低效,所以Server必须有其他方法来保持它的同步吗?

我的问题是-存储哪些元数据以及Server如何保持其同步?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2014-12-25 20:41:56

没有Server不保存锁存器。存储引擎使用"cookie“跟踪当前索引扫描位置。如果另一个进程在获得cookie后在同一页上使用锁存(其类型意味着页面可能已被更改),则cookie将重新验证。

如果cookie (扫描位置)不再有效,则遍历b树结构(使用存储在cookie中的键+单位信息)以重新获取正确的位置,并更新cookie。

如果感兴趣,下面是验证保存位置时的堆栈捕获:

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

有一些与cookie活动相关的性能计数器,例如Scan Point Revalidations/secUsed page/leaf page cookie

没有公共文档能够准确地描述这一切是如何工作的。上面的细节是基于观察,随后在与保罗兰德尔和鲍勃沃德的谈话中得到证实。

票数 8
EN

Database Administration用户

发布于 2014-12-25 16:15:46

总的来说,数据库元数据和您插入/select/update/delete的用户数据通常受到事务、隔离级别、闩锁和锁的保护。

因为您的问题是关于元数据的,所以一个简单的例子:

  • 根据需要锁队列,以便根据当前存在的约束按“顺序”处理它们。当然,许多查询可以同时运行。
  • 如果存在模式稳定锁(或整个模式稳定锁流),则在释放锁之前,这些锁定对象的元数据不会发生更改。
  • 如果有一个Schema修改锁,一旦它到达队列的头,它将阻塞所有以下模式稳定锁,执行修改,然后在完成时释放锁。

如果这不足以满足您的问题:“存储了哪些元数据,以及Server如何保持其同步?”然后,我建议阅读以下书籍:

Microsoft SQL Server 2008内部程序(开发人员参考),作者: Kalen Delaney、Paul Randal、金伯利·特里普、康诺·坎宁安、亚当·马查尼和本杰明·内瓦雷斯。(所有Server引擎。)一个链接,如果你需要的话:

http://www.amazon.com/Microsoft-Server-Internals-Developer-Reference/dp/0735626243/

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/87001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档