查询计划Hash和查询Hash

简介: 原文:查询计划Hash和查询Hash查询计划hash和查询hash   在SQL Server 2008中引入的围绕执行计划和缓冲的新功能被称为查询计划hash和查询hash。这是使用针对查询或查询计划的算法来生成二进制hash值的二进制对象。
原文: 查询计划Hash和查询Hash

查询计划hash和查询hash

  在SQL Server 2008中引入的围绕执行计划和缓冲的新功能被称为查询计划hash和查询hash。这是使用针对查询或查询计划的算法来生成二进制hash值的二进制对象。

  可以从sys.dm_exec_query_stats或sys.dm_exec_requests检索查询计划hash和查询hash。虽然这是确认查询及其计划的一种机制,但是hash值不是唯一的。不相似的查询可能得出相同的hash,所以不能将其作为备份主键。

  分别创建两个查询如下:

SELECT * FROM PersonHunderThousand INNER JOIN Province
ON PersonHunderThousand.PId = Province.Id
WHERE PersonHunderThousand.Name = '郎徊刺'
AND Province.Name = '广东'

SELECT* from PersonHunderThousand INNER JOIN Province 
ON PersonHunderThousand.PId = Province.Id
where PersonHunderThousand.Name = '习笑'
AND Province.Name = '广东'

  两个查询仅仅是from和where大小写不通以及第一个参数不同,设计成INNER JOIN和两个条件稍微复杂点是为了防止简单参数化生成参数计划,再执行以下查询:

SELECT t.text,s.execution_count,s.query_hash,s.query_plan_hash
FROM sys.dm_exec_query_stats s
CROSS APPLY sys.dm_exec_sql_text(s.plan_handle) t

  看到输出如下:

  

  从上面的输入图可以看到,创建了两个不同的计划,因为这些查询不是参数化的,它们太复杂以致不能考虑简单参数化,并且强制参数化关闭。这两个计划有相同的hash值,因为它们不同的方面只是传递的值。大小写的差别对查询hash或查询计划hash来说无关紧要。

  但是如果修改SELECT改为只返回一列:

SELECT PersonHunderThousand.ID FROM PersonHunderThousand INNER JOIN Province 
ON PersonHunderThousand.PId = Province.Id
WHERE PersonHunderThousand.Name = '郎徊刺' 
AND Province.Name ='广东'

  该查询生成了一个新的计划。

  尽管查询的基本结构相同,返回列中的修改也足以改变查询hash和查询计划hash值。

  因为数据分布和索引中的不同可能导致相同的查询得出两个不同的计划,query_hash可能相同,_query_plan_hash可能不同

  

  另外,有时就算只传入一个参数,但是因为根据统计,不同的参数的执行计划不同,也会创建两个计划:

SELECT * FROM PersonTenThousand 
WHERE Id = 1/100 --假若传入的参数会生成不同的执行计划,那么也会创建不同的计划

  查询计划hash和查询hash值对于跟踪完全不同的查询之间的常见问题可能是有用的工具,但是正如所见,它们不能再每种可能性中得到一组精确的信息。它们增加了又一种确认查询性能可能低下的场所的有用工具。可以在将查询部署到生产环境仲之后捕捉查询的query_plan_hash,然后随时观察以了解其是否因数据变化而变化。由此,可以引用sys.dm_exec_query_stats根据计划跟踪集合的查询状态,但是要记住,这些集合的数据在服务器重启时会重置。

 

目录
相关文章
|
8月前
|
存储 算法
|
9月前
|
算法 JavaScript 数据库
GPDB中的HASH JOIN解析
GPDB中的HASH JOIN解析
64 0
|
10月前
|
存储 算法
hash
一.什么是hash 百度百科上的定义是: 是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
58 0
|
11月前
|
存储 算法 安全
Hash 算法详细介绍与实现 (二)
书接上回,昨天写了第一部分,《Hash 算法详细介绍与实现 (一)》详细介绍了Hash表和Hash算法的相关概念以及算法的基本原理。同时简单介绍几种hash算法的实现:直接取余法和乘法取整法;本文接着详细唠唠Hash算法和Hash表这个数据结构的具体实现以及Hash算法和Hash表常见问题的解决方案,比如解决Hash表的冲突问题等等.相关的理论知识已在上篇文章详细介绍,这里就不再赘述,多的不说少的不唠,直接进入今天的主题:利用Hash算法实现Hash表
391 1
|
前端开发 JavaScript
hash、chunkhash和contenthash
webpack 通用配置优化
95 0
hash、chunkhash和contenthash
|
存储 算法 安全
什么是 Hash 算法?
散列算法(Hash Algorithm),又称哈希算法,杂凑算法,是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。因此,当原有文件发生改变时,其标志值也会发生改变,从而告诉文件使用者当前的文件已经不是你所需求的文件。
什么是 Hash 算法?
|
存储 算法
Hash 算法有哪些?
Hash 算法有哪些?
162 0
Hash 算法有哪些?
|
存储 编译器
查找——HASH
查找——HASH
205 0
查找——HASH
|
存储
Admiral(双向BFS + Hash)
Problem Description Suppose that you are an admiral of a famous naval troop. Our naval forces have got 21 battleships.
1095 0