查询计划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的更多相关文章

  1. SQL Server-聚焦查询计划Stream Aggregate VS Hash Match Aggregate(二十)

    前言 之前系列中在查询计划中一直出现Stream Aggregate,当时也只是做了基本了解,对于查询计划中出现的操作,我们都需要去详细研究下,只有这样才能对查询计划执行的每一步操作都了如指掌,所以才 ...

  2. 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划

    淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划 SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理执行计划.前两个步骤请参见我的博客<<淘宝数据库O ...

  3. 淘宝数据库OceanBase SQL编译器部分 源代码阅读--生成物理查询计划

    SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理运行计划. 前两个步骤请參见我的博客<<淘宝数据库OceanBase SQL编译器部分 源代码阅读--解析SQL语法树>& ...

  4. Greenplum查询计划分析

    这里对查询计划的学习主要是对TPC-H中Query2的分析. 1.Query的查询语句 select s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_a ...

  5. 看懂SqlServer查询计划【转】

    原文链接:http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html 开始 SQL Server 查找记录的方法 SQL Server ...

  6. 【转载】看懂SqlServer查询计划

    看懂SqlServer查询计划 阅读目录 开始 SQL Server 查找记录的方法 SQL Server Join 方式 更具体执行过程 索引统计信息:查询计划的选择依据 优化视图查询 推荐阅读-M ...

  7. 看懂SqlServer查询计划

    看懂SqlServer查询计划 阅读目录 开始 SQL Server 查找记录的方法 SQL Server Join 方式 更具体执行过程 索引统计信息:查询计划的选择依据 优化视图查询 推荐阅读-M ...

  8. 看懂SqlServer查询计划 SQL语句优化分析

    转自 http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html 阅读目录 开始 SQL Server 查找记录的方法 SQL Ser ...

  9. Mongodb索引和执行计划 hint 慢查询

    查询索引 索引存放在system.indexes集合中 > show tables address data person system.indexes 默认会为所有的ID建上索引 而且无法删除 ...

随机推荐

  1. oracle SGA详解

    SGA(System Global Area)系统全局区.这是一个非常庞大的内存区间,也是为什么开启oracle之后占用了很大内存的原因. SGA分为不同的池,我们可以通过视图v$sgastat查看, ...

  2. struts2上传

    注意事项:文件名必须是:文件域+FileName,如: // 封装上传文件域的属性 private File uploadImage; // 封装上传文件名的属性 private String upl ...

  3. PHP程序中删除字符串最后一个字符的三种方法

    常见的语法格式: foreach ($arr as $key => $value) {$arr_str = $arr['x_id'] . ',' . $arr_str;} 假设字符数组 $arr ...

  4. iOS学习之Table View的简单使用

    Table View简单描述: 在iPhone和其他iOS的很多程序中都会看到Table View的出现,除了一般的表格资料展示之外,设置的属性资料往往也用到Table View,Table View ...

  5. 日常css和js小知识点记录

    2015-6-29 1.<meta name="viewport" content="width=device-width,user-scalable=no&quo ...

  6. MySQL存储引擎中的MyISAM和InnoDB区别详解

    在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问.为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数 ...

  7. UINavigationController侧滑滑动返回 卡死问题

    UINavigationController滑动返回,有需要的朋友可以参考下. 最近做了UINavigationController的滑动返回(IOS7及以后系统默认支持的), 主要分成以下几步以及碰 ...

  8. java面试每日一题9

    题目:判断一个数是否是2的方次幂 public class Power { public static void main(String [] args) throws NumberFormatExc ...

  9. [HTML]页面间传值的五种方法

    一.QueryString传值:1. 这是最简单的传值方式,但缺点是传的值会显示在浏览器的地址栏中且不能传递对象,只适用于传递简单的且安全性要求不高的整数值,例如: 2. 新建一个WEB项目,添加一个 ...

  10. poj-3259-wormholes-spfa-判负环

    题意:N个顶点, M条双向边, W条权值为负的单向边.求是否存在负环. 思路:首先你要懂bellman-ford或spfa..这是基础的spfa判断是否存在负环的题,存在负环的节点会重复入队(因为最短 ...