SQL SERVER中Key Hash Value的作用(下)
虽然对于keyhashvalue的研究还有很多问题还没有解决,但是基本可以确定“keyhashvalue是用来锁 定资源的”
而不是我之前说的,在seek的时候根据这个KeyHashValue来快速查找到对应的记录 误导大家了,真的不好意思!!!! 资源 说明 KEY是靠生成的这个KeyHashValue来进行锁定索引中的行 KEY 用于锁定索引上的某一行 为什么需要这个KeyHashValue??? 由于很苟很苟没有写C#代码,不过我觉得从C#的多线程同步来理解会更加好 例如: lock 语句 lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图 进入锁定的代 码,则它将一直等待(即被阻止),直到该对象被释放,大家可以把同步对象理解为 KeyHashValue c# 多线程同步 c# 多线程同步 大家还是看给出的文章链接吧,因为本人很苟很苟没有写C#代码了,细节的东西看文章比较好 网上有很多相关的文章: 例如 建立索引的时候为什麽有900bytes的限制 为了性能,不可能让您在比较大的数据类型下,而且存储了非常多的数据的字段上建立索引 因为这样做的话,要计算出KeyHashValue就会非常消耗性能 这篇文章:Improvement in minimizing lockhash key collisions in SQL Server 2008R2 and its impact on concurrency
引入
我将这些文章整理到我的文章里:undocumented virtual column %%lockres%% 在SQLSERVER2005下跟SQLSERVER2012下,建立相同的聚集索引,你会看到在SQL2005下,表的聚集索引页面有 KeyHashValue 但是在SQL2012下,表的聚集索引页面的KeyHashValue列全部为NULL 由于我没有SQL2008,所以没有测试SQL2008,估计从SQL2008开始,KeyHashValue开始有些变化了 在SQL2005里,你使用dbcc page查看数据页面,数据页面里的每行记录是没有显示KeyHashValue 的,不知道要打开哪个跟踪标记才能看到 在SQL2005里唯一能看到数据页面中的keyhashvalue只有使用%%lockres%% 而在SQL2012,不用做任何设置,使用dbcc page就可以看到KeyHashValue 当然也可以用%%lockres%%: 1 SELECT %%lockres%% AS '数据页的keyhashvalue' FROM 表名 页面126是数据页面 1 DBCC TRACEON(3604,-1) 2 GO 3 DBCC PAGE(testhashkey,1,126,3) 4 GO Slot 0 Offset 0x0 Length 0 Length (physical) 0 KeyHashValue = (8194443284a0) DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。 SQL2012最大的改进是提示非常清晰,而且以前的SQLSERVER版本没有显示出来的东西都给你显示出来了, 这样有时候就不用做那么多系统表的表连接,如果是以前版本的SQLSERVER要查看某一个信息的时候又要做 这个系统表的表连接又要做那个表的表连接才能得出这个自己想看的东西,非常繁琐 (编辑:滁州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |