查询计划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根据计划跟踪集合的查询状态,但是要记住,这些集合的数据在服务器重启时会重置。
查询计划Hash和查询Hash的更多相关文章
- SQL Server-聚焦查询计划Stream Aggregate VS Hash Match Aggregate(二十)
前言 之前系列中在查询计划中一直出现Stream Aggregate,当时也只是做了基本了解,对于查询计划中出现的操作,我们都需要去详细研究下,只有这样才能对查询计划执行的每一步操作都了如指掌,所以才 ...
- 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划
淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划 SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理执行计划.前两个步骤请参见我的博客<<淘宝数据库O ...
- 淘宝数据库OceanBase SQL编译器部分 源代码阅读--生成物理查询计划
SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理运行计划. 前两个步骤请參见我的博客<<淘宝数据库OceanBase SQL编译器部分 源代码阅读--解析SQL语法树>& ...
- Greenplum查询计划分析
这里对查询计划的学习主要是对TPC-H中Query2的分析. 1.Query的查询语句 select s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_a ...
- 看懂SqlServer查询计划【转】
原文链接:http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html 开始 SQL Server 查找记录的方法 SQL Server ...
- 【转载】看懂SqlServer查询计划
看懂SqlServer查询计划 阅读目录 开始 SQL Server 查找记录的方法 SQL Server Join 方式 更具体执行过程 索引统计信息:查询计划的选择依据 优化视图查询 推荐阅读-M ...
- 看懂SqlServer查询计划
看懂SqlServer查询计划 阅读目录 开始 SQL Server 查找记录的方法 SQL Server Join 方式 更具体执行过程 索引统计信息:查询计划的选择依据 优化视图查询 推荐阅读-M ...
- 看懂SqlServer查询计划 SQL语句优化分析
转自 http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html 阅读目录 开始 SQL Server 查找记录的方法 SQL Ser ...
- Mongodb索引和执行计划 hint 慢查询
查询索引 索引存放在system.indexes集合中 > show tables address data person system.indexes 默认会为所有的ID建上索引 而且无法删除 ...
随机推荐
- word2007里插入分节符
1.打开Word文档,将鼠标定位到需要插入分页符的位置(比如第2页的末尾处),切换到"页面布局"功能区. 2.在"页面设置"分组中单击"分隔符&quo ...
- jQuery extend() & jQuery.fn.extend(),插件编写
资料来源:网上资料整理并自行改编测试.复制以下代码并依赖jquery.js,jquery.validate.js即可执行.有误之处,请@我啊,敬请赐教. <!DOCTYPE html PUBLI ...
- Docker Centos安装Redis以及问题处理
之前一篇文章 Redis安装及主从配置 介绍了redis的安装配置,另一篇文件介绍了 Docker Centos安装Openssh .今天将两篇文件结合一下——在Docker Centos环境下搭建r ...
- PHP高级架构技术年度大盘点
2015年1月的最后一个周末,上海的冬季虽不如北方的雪窖冰天,但腊月的寒风也足以让人猫 在家中不愿出门.可是,在华美达酒店的一个会议室中,却人声鼎沸.春意融融,第三期商派技术沙龙正在火热进行,本期沙龙 ...
- snackbar初体验
底部弹出的部分就是snackbar的,右侧可添加一个action响应点击事件,遗憾的时貌似只能添加一个 这是华为mate8上面运行出来的效果,颜色之类的都是默认.不同的android版本样式稍有差异 ...
- C#的OpenFileDialog和SaveFileDialog的常见用法(转)
OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.InitialDirectory = ...
- android应用程序中获取view 的位置
1. 相对位置: getLeft() , getRight(), getTop(), getBottom() 在Android中可以把left相当于X轴值, top相当于Y轴值, 通过这两个值Andr ...
- YTU 2344: 先序遍历二叉树
原文链接:https://www.dreamwings.cn/ytu2344/2603.html 2344: 先序遍历二叉树 时间限制: 1 Sec 内存限制: 128 MB 提交: 4 解决: ...
- 20150624_Andriod _web_service_匹配
using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using S ...
- drawer principle in Combinatorics
Problem 1: Given an array of real number with length (n2 + 1) A: a1, a2, ... , an2+1. Prove that th ...