提高SQL执行效率的方法

标签: sql 方法 | 发表时间:2013-09-19 10:02 | 作者:chuyuqing
出处:http://blog.csdn.net

Oracle提供了多种方法用于减少花在剖析Oracle SQL表达式上的时间,在执行带有大量执行计划的复杂查询时剖析过程会拖累系统的性能。现在我们来简要地看看这些方法中的几种。

  1、使用ordered提示

  Oracle必须花费大量的时间来剖析多表格的合并,用以确定表格合并的最佳顺序。如果SQL表达式涉及七个乃至更多的表格合并,那么有时就会需要超过30分钟的时间来剖析,因为Oracle必须评估表格合并所有可能的顺序。八个表格就会有40,000多种顺序。Ordered这个提示(hint)和其他的提示一起使用能够产生合适的合并顺序。

  Ordered这个提示会要求列在SQL表达式FROM字句里的表格按照指定的顺序进行合并,FROM字句里的第一个表格会指定驱动表格(driving table)。驱动表格应该是返回最小行数的表格。使用ordered提示会跳过非常耗时和耗资源的剖析操作,并加快Oracle SQL的执行。

  Listing A如下:

  以下是引用片段:

  Listing A

  select /*+ ordered use_nl(bonus)

  parallel(e, 4) */ e.ename, hiredate, b.comm from emp e, bonus b

  where e.ename = b.ename ;

  Listing A里是一个复杂查询的例子,这个查询被强制进行一个嵌套循环,从而与对emp表格进行的并行查询合并。要注意,我已经使用ordered提示来引导Oracle去按照WHERE子句所列出的顺序来评估表格。

  2、使用theordered_predicates

  ordered_predicates提示在查询的WHERE子句里指定的,并被用来指定布尔判断(Boolean predicate)被评估的顺序。在没有ordered_predicates的情况下,Oracle会使用下面这些步骤来评估SQL判断的顺序:

  子查询的评估先于外层WHERE子句里的Boolean条件。

  所有没有内置函数或者子查询的布尔条件都按照其在WHERE子句里相反的顺序进行评估,即最后一条判断最先被评估。

  每个判断都带有内置函数的布尔判断都依据其预计的评估值按递增排列。

  你可以使用ordered_predicates提示来强制取代这些缺省的评估规则,那么你WHERE子句里的项目就会按照其在查询里出现的顺序被评估。在查询的WHERE子句里使用了PL/SQL函数的情况下,通常会使用ordered_predicates提示。如果你知道限制最多的判断并且希望Oracle最先评估这些判断的时候,在这种情况下,它也是非常有用的。用法提示:你不能使用ordered_predicates提示来保存对索引键进行判断评估的顺序。

  3、限制表格合并评估的数量

  提高SQL剖析性能的最后一种方法是强制取代Oracle的一个参数,这个参数控制着在评估一个查询的时候,基于消耗的优化器所评估的可能合并数量。

  optimizer_search_limit这个参数会指定表格合并组合的最大数量,后者将会在Oracle试图确定合并多表格最佳方式的时候被评估。这个参数有助于防止优化器花更多的时间来评估可能的合并顺序,而不是把时间花在寻找最佳合并顺序上。optimizer_search_limit还控制着用于调用star join提示的阙值,当查询里的表格数量低于optimizer_search_limit(其缺省的值是5)的时候,star提示就会被光顾。

作者:chuyuqing 发表于2013-9-19 2:02:01 原文链接
阅读:0 评论:0 查看评论

相关 [sql 方法] 推荐:

提高SQL执行效率的方法

- - CSDN博客推荐文章
Oracle提供了多种方法用于减少花在剖析Oracle SQL表达式上的时间,在执行带有大量执行计划的复杂查询时剖析过程会拖累系统的性能. 现在我们来简要地看看这些方法中的几种.   1、使用ordered提示.   Oracle必须花费大量的时间来剖析多表格的合并,用以确定表格合并的最佳顺序. 如果SQL表达式涉及七个乃至更多的表格合并,那么有时就会需要超过30分钟的时间来剖析,因为Oracle必须评估表格合并所有可能的顺序.

Sql Server 大数量插入方法简单汇总

- ddtd - 博客园-首页原创精华区
   在某些场景下,可能需要在短时间内向数据库中插入大量数据,数据来源可能是性能非常高的实时数据库或者文件,然后转换为关系数据库中的内容,这就要求关系数据库具有非常高的写入性能.     解决办法1:在默认情况下,Sql Server把每一次写入当做一个事物处理,在大数据量写入的情况下,每一次写入的事物处理需要耗费非常多的性能和时间,如果插入10w条记录,使用10w次insert语句,在普通pc上30秒钟都无法完成,如果仅启用一次事物,然后做10W次insert操作,仅需要短短的1秒钟就可以完成.

Oracle EBS SQL Trace日志收集的方法

- - CSDN博客推荐文章
Raw Trace的收集方法. 打开Trace,Help > Diagnostics > Trace > Trace > Trace with Binds and Waits. Trace项代表的意思. 3.关闭Trace,Help > Diagnostics > Trace > Trace > No Trace.

Sybase ASE15.x中启用跟踪SQL语句的方法

- - CSDN博客推荐文章
当说到跟踪SQL语句,有人可能会问起这个功能,也许有人会想到用审计功能,为了跟踪SQL语句,去启用审计功能,会成为一种浪费,或许用户只是想跟踪某一个连接的所有SQL语句呢. 1> set tracefile "d:/abc.txt" 2> go 1> set show_sqltext on 2> set statistics io on 3> go 1> select * from t123 2> go id.

查看sql语句执行时间的方法

- - SQL - 编程语言 - ITeye博客
SQL Server中可以通过设置STATISTICS查看执行SQL时的系统情况. 1、选项有PROFILE,IO ,TIME. SET STATISTICS PROFILE ON:显示分析、编译和执行查询所需的时间(以毫秒为单位). SET STATISTICS IO ON:报告与语句内引用的每个表的扫描数、逻辑读取数(在高速缓存中访问的页数)和物理读取数(访问磁盘的次数)有关的信息.

MYSQL查询SQL语句性能优化方法

- - 数据库 - ITeye博客
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,. Sql 代码 : select id from t where num is null;.

常见SQL注入方法整理系列-初始篇

- - FreeBuf.COM | 关注黑客与极客
前面介绍了MSSQL、MYSQL以及ORACLE的一些涉及安全体系的基本知识,且当作知识的积累或者温故吧. 本篇主要介绍这三种数据库的攻击手法,力求形成一套攻击流程,当然流程是死的,在真实的攻击环境中还是需要发挥聪明才智的,所以也且当作参考笔记吧. 万事开头难,SQL注入攻击同样如此. 给定一个WEB站点URL,发现该站点SQL注入漏洞最快的方法莫过于使用扫描工具,最有效的我自认为是查看应用程序源代码.

一个案例教包含优化OLAP超大型SQL的常用方法

- - CSDN博客推荐文章
环境: EXADATA V2 , 版本 11.2.0.2.0. 我的PM抱怨对我说,APEX上面有个SQL 要跑很久,最开始它跑3-5分钟,过了段时间,随着业务的变换,数据的增长,它要跑20分钟,随着数据的不断增长到现在它要跑1小时. PM说,这个SQL执行非常频繁,这里你想到了什么呢. 因为是11g,我们可以利用result cache去优化它,但是即使用了result cache,我们依然要面对一个事实--------第一次执行的时候它很慢,所以这个SQL必须优化.

浅谈MySQL中优化sql语句查询常用的30种方法

- - 数据库 - ITeye博客
本篇文章是对MySQL中优化sql语句查询常用的30种方法进行了详细的分析介绍,需要的朋友参考下. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描.

PL/SQL动态SQL(原创)

- - ITeye博客
使用动态SQL是在编写PL/SQL过程时经常使用的方法之一. 很多情况下,比如根据业务的需要,如果输入不同查询条件,则生成不同的执行SQL查询语句,对于这种情况需要使用动态SQL来完成. 再比如,对于分页的情况,对于不同的表,必定存在不同的字段,因此使用静态SQL则只能针对某几个特定的表来形成分页.