- 1、本文档共43页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据库培训高效率sql语句基础汇编
Oracle数据库培训
高效率SQL语句基础
--张林
一个高效率的数据库系统是从两个方面来评价的:
响应时间和吞吐量。?
在应用系统开发阶段,由于开发库上的数据比较少,在SQL语句的编写上感觉不出各种写法的性能差异,在将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就会成为最需要解决的主要问题之一。?缩短系统的响应时间,增加操作的并发度,可以提高系统的吞吐量。
要缩短系统的响应时间,就需要可以高效率执行的SQL语句。
引言
一、优化器介绍
二、高效率SQL基础
三、oracle的执行计划
四、书写高效率SQL语句建议
目录
Oracle?数据库中优化器(Optimizer)是SQL分析和执行的优化工具,它负责指定SQL的执行计划,也就是它负责保证SQL执行的效率最高,比如优化器决定Oracle?以什么样的方式来访问数据,是全表扫描(Full Table Scan),索引范围扫描(Index Range Scan)还是全索引快速扫描(INDEX Fast Full Scan:INDEX_FFS);对于表关联查询,它负责确定表之间以一种什么方式来关联,比如HASH_JOHN还是NESTED LOOPS?或者MERGE JOIN。?这些因素直接决定SQL的执行效率,所以优化器是SQL?执行的核心,它做出的执行计划好坏,直接决定着SQL的执行效率。
优化器介绍
Oracle?的优化器有两种:
???????????????????RBO(Rule-Based Optimization):?基于规则的优化器
???????????????????CBO(Cost-Based Optimization):?基于代价的优化器
?????????从Oracle 10g开始,RBO?已经被弃用,但是我们依然可以通过Hint?方式来使用它。
CBO的思路是让Oracle?获取所有执行计划相关的信息,通过对这些信息做计算分析,最后得出一个代价最小的执行计划作为最终的执行计划。
优化器介绍
使用CBO 时,需要注意如下几个方面:
1、编写SQL语句时,不必考虑FROM 子句后面的表或视图的顺序和WHERE 子句后面的条件顺序;
2、使用CBO 时,SQL语句 FROM 子句后面的表的个数不宜太多,因为CBO在选择表连接顺序时,会对FROM 子句后面的表进行阶乘运算,选择最好的一个连接顺序。
3、如果一个语句使用 RBO的执行计划确实比CBO 好,则可以通过hint机制,强制使用RBO。
Hint机制可以参考这篇文章:/blog/1478465
优化器介绍
理解索引
大多数情况下,数据库使用索引来检索表,优化器根据用户定义的索引来提高执行性能。但是,如果在SQL语句的where子句中写的SQL代码不合理,就会造成优化器忽略索引而采用全表扫描,而这种SQL语句就是所谓的劣质SQL语句。在编写SQL语句时需要了解优化器根据何种原则来使用索引,这将有助于写出高性能的SQL语句。
高效率SQL基础
1、条件中包含NULL值(IS NULL 与 IS NOT NULL)
以NULL值做条件时,将无法使用包含NULL值的列上的索引。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,在使用NULL值做条件时,即使对该列建索引也不会提高性能。
理解索引-常见问题分析
2、列的连接
列被包含到表达式中导致不能使用索引。?对于有连接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。
例:
假定有一个职工表(employee),对于一个职工的姓和名分成两列存放
(FIRST_NAME)和(LAST_NAME),现在要查询一个叫Bill?Cliton的职工。
下面是一个采用联接查询的SQL语句:
select?*?from?employee?where?first_name||’ ’||last_name?=‘Bill?Cliton’;??
改进方法:
select?*?from?employee?where?first_name?=?‘Bill’?and?last_name?=?‘Cliton’;
理解索引-常见问题分析
3、带通配符(%)的like语句
select?*?from?employee?where?last_name?like?%cliton%;???
由于通配符(%)在搜寻词首出现,所以数据库将不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有数,通配符如此使用会降低查询速度。??当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用
文档评论(0)