执行计划组件、组件、老化

原文:执行计划组件、组件、老化

一、执行计划缓冲

  优化器生成的执行计划保存在SQL Server内存池中的一个特别部分,被称为计划缓冲或过程缓冲。过程缓冲是SQL Server缓存的一部分。在缓冲中保存计划可使SQL Server避免在重新提交相同的查询时再次通过整个查询优化过程运行。SQL Server支持不同的技术,如:计划缓冲老化,计划缓冲类型来增加缓存的计划的可重用性。它还保存两个被称为hash和查询计划hash的二进制值。

二、执行计划组件

  优化器生成的执行计划包含两个组件:

  • 查询计划:这代表指定执行查询所需要的物理操作命令;
  • 执行上下文:这维护给定用户上下文中查询的可变部分;

  1、查询计划

  查询计划是一个可再入的只读数据结构,具备指定所有执行查询所需要的物理操作的命令。可再入属性使查询计划可以被多个连接并发访问。物理操作包括所访问的表和索引的规格,访问的方式和顺序,多个表之间执行的连接操作类型等。查询计划中没有保存用户上下文。对于单个查询,可能由两个查询计划的拷贝:串行计划和并行计划。

  2、执行上下文

  执行上下文是维护查询可变部分的另一个数据结构。虽然服务器在过程缓冲中记录执行计划,但是这些计划是独立于上下文的。因此,每个执行该查询的用户将有独立的执行上下文,用来保存专用于其执行的数据,如参数值和连接细节。

三、执行计划的老化

  过程缓冲是SQL Server缓存的一部分,SQL Server缓存还保存数据页面。随着不断有新的执行计划被添加到过程缓冲,过程缓冲将越来越大,影响内存中有用的数据页面的存储。为了避免这种情况,SQL Server动态控制过程缓冲中执行计划的存储,保留最常用的执行计划并放弃在一段时间中不使用的计划。

  SQL Server将执行计划与一个寿命字段关联,以此来记录执行计划重用的频率。生成执行计划时,寿命字段初始值用生成该计划的开销填充。需要大规模优化的复杂查询将具有比简单查询功能更高的寿命字段值。

  在固定的时间间隔,过程缓冲中所有执行计划的寿命字段由SQL Server的lazy writer进程确定(这个进程管理SQL Server中大部分的后台进程)。如果执行计划长时间没有被重用,寿命字段最终被减小为0。一旦执行计划的寿命字段为0,该计划即成为从内存中删除的候选者。SQL Server在内存压力增加到没有足够的空闲内存以服务新的请求时,从过程缓冲删除所有寿命字段为0的计划。但是,如果系统有足够的内存并且有空闲的内存页以服务新的请求,寿命字段为0的执行计划可以长期保存在过程缓冲中,这样他们在需要时可以重用。

  除了老化,执行计划在每次重用时,寿命字段会增加生成计划的开销值。例如,假定有两个执行计划,生成开销为100和10。它们起始的寿命字段值将分别为100和10。如果两个计划都立即被重用,它们的寿命分别增加到200和20。由于这些寿命字段值,lazy writer进程将第二个计划的开销值下降到0比第一个计划容易得多,除非第二个计划更经常被重用。因此,即使一个开销较大的计划重用的频率小于更经济的计划,因为开销对寿命字段的影响,开销较大的计划仍然可能在更长时间里保持非0的寿命值。

四、分析执行计划缓冲

  可以通过访问动态管理视图sys.dm_exec_cached_plans来获得许多关于过程缓冲中执行计划的信息,如:

SELECT * FROM sys.dm_exec_cached_plans

  下面来看看这个视图提供了哪些有用的信息:

列名 描述
refcounts 缓冲中引用该这个计划的其他对象数量
usecounts 对象添加到缓冲计划之后的使用次数
size_in_bytes 保存在缓冲中的计划大小
cacheobjtype
缓冲对象类型:

Compiled plan:完整的执行计划;

Compiled plan stub:用于即席查询的标记;

Parse tree:用于访问视图的计划;

objtype
生成该计划的对象类型:

Proc(过程);

Prepared(预定义的);

Ad hoc(即席);

View(视图);

Plan_handle 计划句柄,内存中这个计划的标识符,用于检索查询文本和执行计划

  详细可以到这里了解:http://msdn.microsoft.com/zh-tw/library/windowsazure/hh977100.aspx

  单独使用sys.dm_exec_cached_plans只能得到部分信息。接下来的两部分也一样重要。使用动态管理函数sys.dm_exec_query_plans和sys.dm_exec_cached_plans组合,将可以得到XML执行计划本身,这样既可以显示并处理它。如果接着引入sys.dm_exec_sql_text,还能检索原始的查询文本。这在运行这里的例子中的已知查询时看上去没有用,但是当你转到自己的生产系统并开始从缓冲中读出执行计划时,获得原始查询时很方便的,为了得到缓冲的计划的详细性能度量,可以使用sys.dm_exec_query_stats返回数据。除了其他数据之外,查询hash和查询计划hash存储在这个DMF中。

时间: 2024-12-30 22:26:30

执行计划组件、组件、老化的相关文章

推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler

原文:推荐一个简单.轻量.功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler 在C#WINFORM或者是ASP.NET的WEB应用程序中,根据各种定时任务的需求,比如:每天的数据统计,每小时刷新系统缓存等等,这个时候我们得应用到定时器这个东东. .NET Framework有自带的timer,但这个类只能完成一些简单的定时操作,比如间隔多久执行什么操作.遇到一些复杂的定时任务,如从当前时间开始,多少时间后间隔重复执行,timer类处理起来就相对困难了.经过多

SSIS中执行SQL任务组件参数传递的问题

原文:SSIS中执行SQL任务组件参数传递的问题 症状: 执行SQL任务,传递参数到子查询中,执行报错. 错误: 失败,错误如下:"无法从使用 sub-select 查询的 SQL 语句中派生出参数信息.请在准备命令之前设置参数信息.".失败的原因可能有: 查询本身有问题.未正确设置 "ResultSet" 属性.未正确设置参数或未正确建立连接. 原因:  在 OLE DB 连接管理器中使用参数 如果执行 SQL 任务使用 OLE DB 连接管理器,则该任务的 By

Spark SQL 物理执行计划各操作实现

SparkStrategy: logical to physical Catalyst作为一个实现无关的查询优化框架,在优化后的逻辑执行计划到真正的物理执行计划这部分只提供了接口,没有提供像Analyzer和Optimizer那样的实现. 本文介绍的是Spark SQL组件各个物理执行计划的操作实现.把优化后的逻辑执行计划映射到物理执行操作类这部分由SparkStrategies类实现,内部基于Catalyst提供的Strategy接口,实现了一些策略,用于分辨logicalPlan子类并替换为

《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一第一篇 执行计划

第一篇 执行计划 执行计划是指示Oracle如何获取和过滤数据.产生最终结果集,是影响SQL语句执行性能的关键因素.我们在深入了解执行计划之前,首先需要知道执行计划是在什么时候产生的,以及如何让SQL引擎为语句生成执行计划. 在深入了解执行计划之前,我们先了解SQL语句的处理执行过程.当一条语句提交到Oracle后,SQL引擎会分为三个步骤对其处理和执行:解析(Parse).执行(Execute)和获取(Fetch),分别由SQL引擎的不同组件完成.SQL引擎的组件如图1-1所示. 1. SQL

《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一2.5 执行计划中其他信息的含义

2.5 执行计划中其他信息的含义 通过DBMS_XPLAN输出执行计划,除了计划本身外,还可以获得一些其他信息帮助我们进一步分析执行计划及语句性能. 2.5.1 查询块和对象别名 在使用DBMS_XPLAN显示执行计划时,选择'ADVANCED'预定义格式作为参数或者加入'ALIAS'控制字符串,可以在输出中看到以下内容: Query Block Name / Object Alias (identified by operation id): -------------------------

SQL Server查询优化器:最佳执行计划

我们知道,查询优化器的基本的目标就是为我们的查询语句找出一个比较高效的执行计划.即使是一个非常简单的查询,也会存在很多的不同方式去访问数 据,而这些不同的方式都是可以得到相同的结果的,所以,查询优化器必须要很"明智的"从这些大量的执行计划中找出了一个"最佳"的出来. 前一篇:浅析SQL Server查询优化器的工作原理 为了得到最好的计划,查询优化器必须在某些条件的限制下,尽可能多的创建和评估大量的候选执行计划.看到这里,就有一点需要注意了"查询优化器是尽

SQL Server 执行计划缓存

原文:SQL Server 执行计划缓存 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述   了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储,这也是写这篇文章的目的,在了解执行计划之前先要了解一些基础知识,所以文章前面会讲一些概念,学起来会比较枯燥,但是这些基础知识非常重要.   目录  概述  基础概念  怎样缓存执行计划  SQL Server自动删除执行计划  重新编译执行计划  测试  执行计划相关系统视图  手动清空缓存执

《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一1.2 显示执行计划

1.2 显示执行计划 我们现在知道,有三个途径可以获取查询计划:v$sql_plan.dba_hist_sql_plan和PLAN_TABLE.如果需要读取一条SQL语句的执行计划,就需要知道该条语句的SQL_ID,如果该语句存在多个游标或者执行计划,则还需要知道游标的CHILD_NUMBER或计划的哈希值(可选).而无论我们通过哪个途径来获取执行计划,显示方式主要是两种:语句查询和包DBMS_XPLAN显示. 1.2.1 通过查询语句显示计划 通过查询语句从一些视图里读出执行计划并作格式化输出

动手写个小组件(组件入门)(1)

动手写个小组件(组件入门) 这篇文章主要是为想将自己的ASP水平提高的人写的! 把ASP代码变成组件,开发者不仅是加快了ASP的速度,而且也能保护自己的代码.这篇文章写出来,也是为了给想开发组件网友上一堂入门课! 下面,我们会来编写一个非常简单的组件,重点是知道怎样开发DLL组件,而不是其复杂的代码!这些都要靠你们自己以后的努力了. 服务器端组件 首先,服务器端的组件要有别于客户端的组件.客户端的组件是通过网络传输,依靠HTML来起作用.而且只能在IE上有用.但是服务器端的组件是运行在服务器端,