zoukankan      html  css  js  c++  java
  • Sql Server中执行计划的缓存机制

    Sql查询过程      

    当执行一个Sql语句或者存储过程时, Sql Server的大致过程是

    1. 对查询语句进行分析,将其生成逻辑单元,并进行基本的语法检查

    2. 生成查询树(会将查询语句中所有操作转换为对基表的操作,比如将视图转换为基表查询)

    3. 生成执行计划(针对查询树会生成很多不同的执行计划)

    4. 查询优化器基于每个执行计划的查询成本和数据库中的统计信息,选择一个最优执行计划

    5. 最优执行计划会被缓存在数据库的缓存池中。当再次执行相同Sql语句时,缓存的执行计划会被直接使用。这样可以提高性能。

    查看缓存执行计划DMV  

    通过sys.dm_exec_cached_plans可以查询到当前系统缓存的执行计划。比如:如下代码可以查询缓存的所有为存储过程生成的最优执行计划

    select * from sys.dm_exec_cached_plans where objtype = 'Proc'

    查询结果中显示了该执行计划被重复使用的次数。

    注:普通的存储过程是在第一次被执行的的时候才会被编译,然后生成执行计划并缓存。

    通过上面对查询过程的描述,我们通过Management Studio直接执行的语句的执行计划也会被缓存。

    通过如下查询可以得到缓存的列表

    select * from sys.dm_exec_cached_plans where objtype = 'Adhoc'

    同时,通过查询sys.dm_exec_text_query_plan可以得到某个查询计划的详细信息。比如:以下代码可以查询上面所描述存储过程的执行计划的详情

    declare @planHandle varbinary(64)
    SELECT @planHandle = plan_handle from sys.dm_exec_cached_plans where bucketid = 6124
    select * from sys.dm_exec_text_query_plan(@planHandle,0,-1)

    结果如下:

    query_plan列的值是描述执行计划详情的xml

    执行计划的管理    

    1. 当数据库重启时会被清空。然后我们也可以通过执行DBCC FREEPROCCACHE来清空缓存。

    2. 而当数据库内存不足时,也会通过特定的机制将使用频率低的执行计划从缓存中清除。

  • 相关阅读:
    关于重载和重写的区别
    UML的关联(Association), 聚合(Aggregation), 组合(Composition)区别
    解析CSS加密技术之“障眼法”
    ASP.NET中MEMCACHED
    新建项目的无法应用已有项目
    C# 判断两张图片是否一致的快速方法
    压力测试中需要掌握的几个基本概念
    软件测试Web数据分析工具HttpWatch安装
    在SQL Server实现最短路径的搜索
    从算法入手讲解如何在SQL Server中实现最优最简
  • 原文地址:https://www.cnblogs.com/Code-life/p/9196462.html
Copyright © 2011-2022 走看看