没有合适的资源?快使用搜索试试~ 我知道了~
通过分析SQL语句的执行计划优化SQL总结.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 115 浏览量
2022-07-05
08:42:55
上传
评论
收藏 168KB DOC 举报
温馨提示
试读
40页
通过分析SQL语句的执行计划优化SQL总结.doc
资源推荐
资源详情
资源评论
通过分析
SQL
语句的执行计划优化
SQL( 总结 )
第 章 性能调整综述
第 章 有效的应用设计
第 章 语句处理的过程
第 章 的优化器
第 章 的执行计划
访问路径方法
表之间的连接
如何产生执行计划
如何分析执行计划
如何干预执行计划 使用 提示
具体案例分析
第 章 其它注意事项
附录
第 1 章 性能调整综述
数据库是高度可调的数据库产品。本章描述调整的过程和那些人员应与 服务器的调整有关,以与与调整相关联的操作系统硬件和软件。本章包括以下方面
谁来调整系统
什么时候调整
建立有效调整的目标
在设计和开发时的调整
调整产品系统
监控产品系统
谁来调整系统:
为了有效地调整系统,若干类人员必须交换信息并牵涉到系统调整中,例如
应用设计人员必须传达应用系统的设计,使得每个人都清楚应用中的数据流动!
应用开发人员必须传达他们选择的实现策略,使得语句调整的过程中能快速、容易地识别有问题的应用模块和可疑的 语句!
数据库管理人员必须仔细地监控系统活动并提供它们的资料,使得异常的系统性能可被快速得识别和纠正!
硬件 " 软件管理人员 必须传达系统的硬件、软件配置并提供它们的资料,使得相关人员能有效地设计和管理系统。
简而言之,与系统涉与的每个人都在调整过程中起某些作用,当上面提与的那些人员传达了系统的特性并提供了它们的资料,调整就能相对的容易和更快一些。
不幸的是,事实上的结果是:数据库管理员对调整负有全部或主要的责任。但是,数据库管理员很少有合适的系统方面的资料,而且,在很多情况下,数据库管理员往
往是在实施阶段才介入数据库,这就给调整工作带来许多负面的影响,因为在设计阶段的缺陷是不能通过 #$ 的调整而得以解决,而设计阶段的缺陷往往对数据库性能造
成极大的影响。
其实,在真正成熟的开发环境下,开发人员作为纯代码编写人员时,对性能的影响最小,此时大部分的工作应由应用设计人员完成,而且数据库管理员往往在前期的需
求管理阶段就介入,为设计人员提供必要的技术支持。
调整并不是数据库管理员的专利,相反大部分应该是设计人员和开发人员的工作,这就需要设计人员和开发人员具体必要的数据库知识,这样才能组成一个高效的团队,然
而事实上往往并非如此。
什么时候作调整?
多数人认为当用户感觉性能差时才进行调整,这对调整过程中使用某些最有效的调整策略来说往往是太迟了。此时,如果你不愿意重新设计应用的话,你只能通过重新
分配存调整 %和调整 &" 的办法或多或少地提高性能。 提供了许多特性,这些特性只有应用到正确地设计的系统中时才能够很提高性能。
1 / 40
应用设计人员需要在设计阶段设置应用的性能期望值。然后在设计和开发期间,应用设计人员应考虑哪些 特性可以对系统有好处,并使用这些特性。
通过良好的系统设计,你就可以在应用的生命周期中消除性能调整的代价和挫折。图 图 说明在应用的生命周期中调整的相对代价和收益,正如你见到的,最有效的
调整时间是在设计阶段。在设计期间的调整能以最低的代价给你最大的收益。
图 在应用生命周期中调整的代价
图 在应用生命周期中调整的收益
当然,即使在设计很好的系统中,也可能有性能降低。但这些性能降低应该是可控的和可以预见的。
调整目标
不管你正在设计或维护系统,你应该建立专门的性能目标,它使你知道何时要作调整。如果你试图胡乱地改动初始化参数或 语句,你可能会浪费调整系统的时间,
而且无什么大的收益。调整你的系统的最有效方法如下:
当设计系统时考虑性能
调整操作系统的硬件和软件
识别性能瓶颈
确定问题的原因
采取纠正的动作
当你设计系统时,制定专门的目标;例如,响应时间小于3秒。当应用不能满足此目标时,识别造成变慢的瓶颈(例如,&" 竞争),确定原因,采取纠正动作。在开发期
间,你应测试应用研究,确定在采取应用之前是否满足设计的性能目标。
当你正在维护生产库系统时,有多种快速有效的方法来识别性能瓶颈。
不管怎样,调整通常是一系列开销。一旦你已确定了瓶颈,你可能要牺牲一些其它方面的指标来达到所要的结果。例如,如果 &" 有问题,你可能需要更多存或磁盘。如果
不可能买,你可能要限制系统的并发性,来获取所需的性能。然而,如果你已经明确地定义了性能的目标,那用什么来交换高性能的决策就变的很容易的,因为你已经确定
了哪些方面是最重要的,如过我的目标为高性能,可能牺牲一些空间资源。
随着应用的越来越庞大,硬件性能的提高,全面的调整应用逐渐变成代价高昂的行为,在这样情况下,要取得最大的投入"效率之比,较好的办法是调整应用的关键部分,
使其达到比较高的性能,这样从总体上来说,整个系统的性能也是比较高的。这也就是有名的 '"(' 原则,调整应用的 ')关键部分,能解决 (')的问题。
在设计和开发系统时作调整
良好设计的系统可以防止在应用生命周期中产生性能问题。系统设计人员和应用开发人员必须了解 的查询处理机制以便写出高效的 语句。“第 章 有效的应
用设计”讨论了你的系统中各种可用的配置,以与每种配置更适合哪种类型的应用。“第 章 优化器”讨论了 的查询优化器,以与如何写语句以获取最快的结果。
当设计你的系统时,使用下列优化性能的准则:
消除客户机/服务器应用中不必要的网络传输。使用存储过程。
使用适合你系统的相应 服务器选件(例如,并行查询或分布式数据库)。
除非你的应用有特殊的需要,否则使用缺省的 锁。
利用数据库记住应用模块,以便你能以每个模块为基础来追踪性能。
选择你的数据块的最佳大小。 原则上来说大一些的性能较好。
分布你的数据,使得一个节点使用的数据本地存贮在该节点中。
2 / 40
调整产品系统
本节描述对应用系统快速、容易地找出性能瓶颈,并决定纠正动作的方法。这种方法依赖于对 服务器体系结构和特性的了解程度。在试图调整你的系统前,你应
熟悉 调整的容。
为调整你已有的系统,遵从下列步骤:
调整操作系统的硬件和软件
通过查询 *+&,-.&/ 视图,识别性能的瓶颈,这个动态性能视图列出了造成会话0等待的事件。
通过分析 *+&,-.&/ 中的数据,决定瓶颈的原因。
纠正存在的问题。
监控应用系统 这主要是通过监控
0
的动态视图来完成。各种有用的动态视图:如
1+0-231+0-1
等 。
第 2 章 有效的应用设计
我们通常将最常用的应用分为
种类型:联机事务处理类型 /4 ,决策支持系统 # 。
联机事务处理(OLTP)
该类型的应用是高吞吐量,插入、更新、删除操作比较多的系统,这些系统以 不断增长的大容量数据为特征 ,它们提供给成百用户同时存取,典型的
/4
系统是订票
系统,银行的业务系统,订单系统。 /4
的主要目标是可用性、速度、并发性和可恢复性 。
当设计这类系统时,必须确保大量的并发用户不能干扰系统的性能。还需要避免使用过量的索引与
5 表 ,因为这些结构会使插入和更新操作变慢。
决策支持(DSS)
该类型的应用将大量信息进行提取形成报告,协助决策者作出正确的判断。典型的情况是:决策支持系统将 /4 应用收集的大量数据进行查询。典型的应用为客户行
为分析系统超市,保险等。
决策支持的关键目标是速度、精确性和可用性。
该种类型的设计往往与 /4 设计的理念背道而驰,一般建议使用数据冗余、大量索引、56、并行查询等。
近年来,该类型的应用逐渐与 4、数据仓库紧密的联系在一起,形成的一个新的应用方向。
第 3 章 SQL
语句处理的过程
在调整之前我们需要了解一些背景知识,只有知道这些背景知识,我们才能更好的去调整 7 语句。
本节介绍了 语句处理的基本过程,主要包括:
8查询语句处理
8#9 语句处理35:3:
8##语句处理!!3:0!!3!!3
8事务控制0;;306<SQL 语句的执行过程(SQL Statement Execution)
图 概要的列出了处理和运行一个 7 语句的需要各个重要阶段。在某些情况下, 运行 7 的过程可能与下面列出的各个阶段的顺序有所不同。如
#=&, 阶段可能在 =/> 阶段之前,这主要依赖你如何书写代码。
对许多 0 的工具来说,其中某些阶段会自动执行。绝大多数用户不需要关心各个阶段的细节问题,然而,知道执行的各个阶段还是有必要的,这会帮助你写出
更高效的 语句来,而且还可以让你猜测出性能差的 语句主要是由于哪一个阶段造成的,然后我们针对这个具体的阶段,找出解决的办法。
3 / 40
图 语句处理的各个阶段
DML 语句的处理
本节给出一个例子来说明在 #9 语句处理的各个阶段到底发生了什么事情。
假设你使用 40? 程序来为指定部门的所有职员增加工资。程序已经连到正确的用户,你可以在你的程序中嵌入如下的 语句:
@A4#/;0B
/BC!'?B
.>:;-:C1-:;-:D
1-:;-: 是程序变量,里面包含部门号,我们要修改该部门的职员的工资。当这个 语句执行时,使用该变量的值。
每种类型的语句都需要如下阶段:
8第 步50创建游标(语句执行缓冲区)
8第 步4;分析语句
8第 步$:B*6绑定变量
8第 E 步5;运行语句
8第 F 步050关闭游标
如果使用了并行功能,还会包含下面这个阶段:
8第 步4G;并行执行语句
如果是查询语句,则需要以下几个额外的步骤,如图 所示:
8第 步#650H5B描述查询的结果集
8第 步#I550H5B定义查询的输出数据
8第 ( 步=020H5B取查询出来的行
下面具体说一下每一步中都发生了什么事情:!
第 1 步: 创建游标(Create a Cursor)
由程序接口调用创建一个游标(50)。任何
语句都会创建它,特别在运行
#9
语句时,都是自动创建游标的,不需要开发人员干预 。多数应用中,游标的
创建是自动的。然而,在预编译程序0?中游标的创建,可能是隐含的,也可能显式的创建。在存储过程中也是这样的。
第 2 步:分析语句(Parse the Statement)
在语法分析期间, 语句从用户进程传送到 , 语句经语法分析后, 语句本身与分析的信息都被装入到共享 区。在该阶段中,可以解决许多类
型的错误。
语法分析分别执行下列操作:
翻译 语句,验证它是合法的语句,即书写正确
实现数据字典的查找,以验证是否符合表和列的定义
在所要求的对象上获取语法分析锁,使得在语句的语法分析过程中不改变这些对象的定义。(
如果在分析并执行过后,对象的定义改变了,那么该
sql
语句还会共享
么?共享也可能没有用处了吧?
)
验证为存取所涉与的模式对象所需的权限是否满足
决定此语句最佳的执行计划
将它装入共享
区
对分布的语句来说,把语句的全部或部分路由到包含所涉与数据的远程节点
以上任何一步出现错误,都将导致语句报错,中止执行。
4 / 40
只有在共享池中不存在等价
语句的情况下,才对
语句作语法分析 (
有问题吧,语法、表列定义、权限还是会先做分析的吧?
)。在这种情况下,数据库核重
新为该语句分配新的共享 区,并对语句进行语法分析。进行语法分析需要耗费较多的资源,所以要尽量避免进行语法分析,这是优化的技巧之一。
语法分析阶段包含了不管此语句将执行多少次,而只需分析一次的处理要求。 只对每个 语句翻译一次,在以后再次执行该语句时,只要该语句还在共享
区中,就可以避免对该语句重新进行语法分析,也就是此时可以直接使用其对应的执行计划(
语法分析、对象确认、权限检查还是都会有的吧?
)对数据进行存取。这
主要是通过绑定变量 6:16 实现 的,也就是我们常说的共享 ,后面会给出共享 的概念。
虽然语法分析验证了 语句的正确性,但语法分析只能识别在 语句执行之前所能发现的错误如书写错误、权限不足等。因此,有些错误通过语法分析是抓不到
的。例如,在数据转换中的错误或在数据中的错(如企图在主键中插入重复的值)以与死锁等均是只有在语句执行阶段期间才能遇到和报告的错误或情况。
查询语句的处理
查询与其它类型的 语句不同,因为在成功执行后作为结果将返回数据。其它语句只是简单地返回成功或失败,而查询则能返回一行或许多行数据。查询的结果均采
用表格形式,结果行被一次一行或者批量地被检索出来。从这里我们可以得知批量的 H 数据可以降低网络开销,所以批量的
H
也是优化的技巧之一。
有些问题只与查询处理相关,查询不仅仅指 / 语句,同样也包括在其它 语句中的隐含查询。例如,下面的每个语句都需要把查询作为它执行的一部分:
&,/&,/6/!!!
A4#/6/JCB.>!!!
#/=96.>!!!
/6/!!!
具体来说,查询
8要求读一致性
8可能使用回滚段作中间处理
8可能要求 语句处理描述、定义和取数据阶段
第 3 步: 描述查询结果(Describe Results of a Query)
描述阶段只有在查询结果的各个列是未知时才需要;例如,当查询由用户交互地输入需要输出的列名。在这种情况要用描述阶段来决定查询结果的特征(数据类型,长
度和名字)。
第 4 步: 定义查询的输出数据(De%ne Output of a Query)''
在查询的定义阶段,你指定与查询出的列值对应的接收变量的位置、大小和数据类型,这样我们通过接收变量就可以得到查询结果。如果必要的话, 会自动实
现数据类型的转换。这是将接收变量的类型与对应的列类型相比较决定的。
第 5 步: 绑定变量(Bind Any Variables)(
绑定变量是在语句解析过程中做的,而以后执行语句只是寻找变量值,是这个意思么?
)
此时, 知道了 语句的意思,但仍没有足够的信息用于执行该语句。 需要得到在语句中列出的所有变量的值 (
得到变量的值
)。在该例中,
需要得到对 :;-: 列进行限定的值。得到这个值的过程 就叫绑定变量 6:K16
此过程称之为将变量值捆绑进来。程序(
是指
sql
语句吧?
)必须指出可以找到该数值的变量名(该变量被称为捆绑变量(
为甚么叫捆绑变量,是因为其上绑定的有值
么?
),变量名实质上是一个存地址,相当于指针)。应用的最终用户可能并没有发觉他们正在指定捆绑变量,因为 的程序可能只是简单地指示他们输入新的值,
其实这一切都在程序中自动做了。
因为你指定了变量名,在你再次执行之前无须重新捆绑变量。你可以改变绑定变量的值,而 在每次执行时,仅仅使用存地址来查找此值。
如果 需要实现自动数据类型转换的话(除非它们是隐含的或缺省的),你还必须对每个值指定数据类型和长度。关于这些信息可以参考 0 的相关文档,如
5 / 40
剩余39页未读,继续阅读
资源评论
智慧安全方案
- 粉丝: 3605
- 资源: 59万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- IMG_5905.PNG
- Cyclone Version 9.51
- 高性能量化回测工具 hikyuu 2.0.3 python 3.12 windows 安装包
- 省级城乡居民基本养老保险情况数据集(2010-2022年).xlsx
- 舞队填写版.cpp
- 基于BP神经网络的多输入单输出回归预测.zip
- 高性能量化回测工具 hikyuu 2.0.3 python 3.9 windows 安装包
- 省级城镇职工基本养老保险情况2000-2022年.xlsx
- 高性能量化回测工具 hikyuu 2.0.3 python 3.10 windows 安装包
- 算法部署-使用OpenVINO+C#部署PaddleOCR字符识别算法-项目源码-优质项目实战.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功