zoukankan      html  css  js  c++  java
  • 查询计划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根据计划跟踪集合的查询状态,但是要记住,这些集合的数据在服务器重启时会重置。

  • 相关阅读:
    lr 增强窗格中,如何生成调试信息?
    lr 自带的例子,如何进行关联,通过代码的函数进行实现
    lr11 录制脚本时候,无法自动启动ie,查了网上很多方法都未解决?
    loadrunner11 录制脚步不成功,在录制概要出现“No Events were detected”,浮动窗口总是显示“0 Events”,解决办法
    loadrunner11 安装及破解教程来自百度文库
    安装loadrunner11 ,出现如下错误如何解决?
    回收站数据删除了,如何进行恢复?
    网管工作方面——————打印机删除了然后开机重启他依然存在,如何解决
    Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
    Sorry, the page you are looking for is currently unavailable. Please try again later. Nginx
  • 原文地址:https://www.cnblogs.com/kissdodog/p/3430909.html
Copyright © 2011-2022 走看看