热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

查询处理和执行----查询优化(2)

计划缓存和复制一旦优化器产生计划,SQLServer就会尽力确保再次利用它。要做到这一点,就要把计划缓存起来,并采取措施确保计划尽可能被广泛地复用,而这又是通过使用参数化选项实现的。SQLServer借助参数化实现类查询复用同一计划。参数化的查询可以通过

计划缓存和复制 一旦优化器产生计划,SQL Server就会尽力确保再次利用它。要做到这一点,就要把计划缓存起来,并采取措施确保计划尽可能被广泛地复用,而这又是通过使用参数化选项实现的。SQL Server借助参数化实现类查询复用同一计划。参数化的查询可以通过

计划缓存和复制

一旦优化器产生计划,SQL Server就会尽力确保再次利用它。要做到这一点,就要把计划缓存起来,并采取措施确保计划尽可能被广泛地复用,而这又是通过使用参数化选项实现的。SQL Server借助参数化实现类似查询复用同一计划。参数化的查询可以通过sys.dm_exec_cached_plans。参数化由SQL Server配置选项simple或forced控制。

计划缓存创建在SQL OS提供的缓存基础设施之上。缓存存储能用于缓存各种对象。计划缓存包含几个不同的缓存存储,用于不同类型的对象。你可以通过下面的SQL查看一些缓存存储的内容:

select name, entries_count, pages_kb from sys.dm_os_memory_cache_counters
where [name] in ( 'object plans', 'sql plans', 'extended stored procedures')


要查找有long lookup times引起的性能问题,你可以查看如下SQL,建议bucket包含的对象不超过20个,查过100个就要注意了。

select * from sys.dm_os_memory_cache_hash_tables
where type in ('cachestore_objcp', 'cachestore_sqlcp', 'cacchestore_phdr', 'cachestore_xproc')

使用下面的SQL查看繁重被使用的buckets:

select bucketid, count(*) as entries_in_bucket
from sys.dm_exec_cached_plans
group by bucketid
order by 2 desc

另一种查找使用相同查询计划哈希的查询的方式是使用如下T-SQL:

select query_plan_hash,count(*) as occurrences
from sys.dm_exec_query_stats
group by query_plan_hash
having count(*) > 1

计划缓存存放Algebrizer树、编译的计划、游标执行上下文、执行上下文等各种对象。下面的SQL查看不同类型对象的统计:

select cacheobjtype, objtype, COUNT (*)
from sys.dm_exec_cached_plans
group by cacheobjtype, objtype
order by cacheobjtype, objtype

要查看执行上下文,你必须传一个plan handle给sys.dm_exec_cached_plans_dependent_objects,然后,做这个之前,你需要运行dbcc freeproccache来清空缓存(不要在生成系统执行)。先运行如下T-SQL,查看ad hoc计划的plan_handle:

select p.refcounts, p.usecounts, p.plan_handle, s.text
from sys.dm_exec_cached_plans as p
cross apply sys.dm_exec_sql_text (p.plan_handle) as s
where p.cacheobjtype = 'compiled plan'
and p.objtype = 'adhoc'
order by p.usecounts desc


将上面结果中的plan_handle带入下面T-SQL即可查看执行上下文:

select * from sys.dm_exec_cached_plan_dependent_objects
(0x060001006C032129A08D41C00100000001000000000000000000000000000000000000000000000000000000)

带入下面的T-SQL可以查看计划的属性:

select * from sys.dm_exec_plan_attributes
(0x060001006C032129A08D41C00100000001000000000000000000000000000000000000000000000000000000)


带入下面T-SQL可以查看sql text:

select * from sys.dm_exec_sql_text
(0x060001006C032129A08D41C00100000001000000000000000000000000000000000000000000000000000000)

编译和重新编译

编译和重新编译差不多,只是在触发次数上稍有不同。当SQL Server判定一个计划不再有效,这通常是因为schema变更、统计变更或一些其他的原因,就会重新编译计划。你可以监视编译或重新编译的发生量,通过观察PerfMon Object SQL Server: SQL Statistics,然后查看下面两个计数器:SQL compilations/sec and SQL recompilations/sec。

影响优化

有两个主要方式能够影响查询优化器--查询提示(hints)或计划向导(guides)。提示要谨慎使用,因为多少情况下SQL Server已经选择了正确的计划,对于复杂的查询或处理复杂的数据集时,使用提示或许是必要的。使用提示之前,去网上搜索“SQL Server Query Hints”,特别是Craig Fredman写的博客。不像锁定提示(SQL Server尝试满足),查询提示更强,所以,如果SQL Server不能满足查询提示,就会产生8622错误,也不会创建任何计划。以下是几个比较受关注的查询提示:

FAST :指定对查询进行优化,以便快速检索第一个 number_rows.。该值是非负整数。 在返回第一个 number_rows 后,查询继续执行并生成完整的结果集。

{Loop | Merge | Hash } JOIN:指定整个查询中的所有联接操作由 LOOP JOIN、MERGE JOIN 或 HASH JOIN 执行。 如果指定了多个联接提示,则优化器从允许的联接策略中选择开销最少的联接策略。要查看它是如何工作的,可以使用类似下面的语句:

MAXDOP number:对于指定了 max degree of parallelism 配置选项的查询,会覆盖 sp_configure 和资源调控器的该选项。 MAXDOP 查询提示可以超出使用 sp_configure 配置的值。 如果 MAXDOP 超出使用资源调控器配置的值,则数据库引擎会使用资源调控器 MAXDOP 值。 当使用 MAXDOP 查询提示时,所有和 max degree of parallelism 配置选项一起使用的语义规则均适用。 如果 MAXDOP 设置为零,服务器将选择最大并行度。

OPTIMIZE FOR:在编译和优化查询时指示查询优化器对局部变量使用特定值。 仅在查询优化期间使用该值,在查询执行期间不使用该值。OPTIMIZE FOR UNKNOWN指示查询优化器在编译和优化查询时使用所有局部变量的统计数据而不是初始值,包括使用强制参数化创建的参数。

RECOMPILE:指示 SQL Server 数据库引擎在执行为查询生成的计划后将其丢弃,从而在下次执行同一查询时强制查询优化器重新编译查询计划。如果未指定 RECOMPILE,数据库引擎将缓存查询计划并重新使用它们。 在编译查询计划时,RECOMPILE 查询提示将使用查询中任意本地变量的当前值,如果查询位于存储过程中,这些当前值将传递给任意参数。在只须重新编译存储过程中的一部分查询,而不是重新编译整个存储过程时,RECOMPILE 是创建使用 WITH RECOMPILE 子句的存储过程的很有用的替代方法。

USE PLAN N'xml_plan':强制查询优化器对查询使用由 'xml_plan' 指定的现有查询计划。 不能使用 INSERT、UPDATE、MERGE 或 DELETE 语句来指定 USE PLAN。

计划向导

在SQL Server 2005就已出现,它能够让DBA在不变更查询本身的情况下影响查询的优化。典型的情况,DBA会使用计划向导试图在第三方应用数据库上调校查询执行,在这里执行的T-SQL代码是不能被改变的。计划向导在SQL Server 2008中得到增强。有3种不同类型的计划向导:

  • 对象计划向导:可用于存储过程、触发器或用户自定义函数
  • SQL计划向导:用于特定的SQL语句
  • 模板计划向导:为特定SQL查询的参数化提供了覆盖数据库设置的一种途径

要利用计划向导,第一步是创建或捕获一个好计划;第二步是把计划应用到你想改变查询优化器行为的对象或T-SQL语句。

推荐阅读
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
author-avatar
carefulff
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有