`
mtnt2008
  • 浏览: 370777 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Oracle WHERE条件执行顺序[转]

阅读更多


sql优化比较复杂,且受环境限制,但开发过程中,写sql要遵循最起码的原则.如下:


   1.ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.

例如:

/* 低效 */

SELECT … FROM EMP E WHERE SAL > 50000 AND JOB = ‘MANAGER’ AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);

 

/* 高效 */

    SELECT … FROM EMP E WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO) AND SAL > 50000 AND JOB = ‘MANAGER’;
 



2.SELECT子句中避免使用’*’

   当在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法.可是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.

3.   使用表的别名(Alias)

当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.

(Column歧义指的是由于SQL中不同的表具有相同的Column名,当SQL语句中出现这个Column时,SQL解析器无法判断这个Column的归属)

分享到:
评论
3 楼 jimn2000 2015-05-04  
yglah 写道
第一条:SQL语句语句的顺序
Oracle并不是按照我们写SQL的顺序来执行的,而是按照执行计划来执行SQL的,所以这里说过滤最大记录的条件写到末尾是不准确的。
这里部分正确是因为如果Oracle选择基于规则的执行计划,这个说法是对的,但是目前基本上所有的Oracle都会选择基于成本的优化方式了,这种方式下,执行计划跟你写条件的顺序基本没啥关系了。
===============================================================
如果不知道什么是基于规则,什么是基于成本的,到百度搜RBO,CBO仔细研究一下吧。Oracle 8以后就推荐CBO了,10g以后已经取消了RBO支持了。但是目前网络上还是有很多人在讨论SQL条件的拼写问题,希望大家不要被误导。



你好

取消了RBO支持了,是什么意思,Oracle不支持了吗?我看我还是可以使用HINT指定RBO的方式啊
2 楼 yglah 2014-12-09  
第一条:SQL语句语句的顺序
Oracle并不是按照我们写SQL的顺序来执行的,而是按照执行计划来执行SQL的,所以这里说过滤最大记录的条件写到末尾是不准确的。
这里部分正确是因为如果Oracle选择基于规则的执行计划,这个说法是对的,但是目前基本上所有的Oracle都会选择基于成本的优化方式了,这种方式下,执行计划跟你写条件的顺序基本没啥关系了。
===============================================================
如果不知道什么是基于规则,什么是基于成本的,到百度搜RBO,CBO仔细研究一下吧。Oracle 8以后就推荐CBO了,10g以后已经取消了RBO支持了。但是目前网络上还是有很多人在讨论SQL条件的拼写问题,希望大家不要被误导。
1 楼 793059909 2014-07-01  
SELECT … FROM EMP E WHERE SAL > 50000 AND JOB = ‘MANAGER’ AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO); 

这个sql没看懂,能否给个表结构及sql的业务含义

相关推荐

    SQL语句执行顺序说明

    执行顺序是从左到右,因此应先处理那些能过滤掉大量记录的条件,以尽早减少数据量。 3. **GROUP BY子句**:如果SQL语句包含GROUP BY子句,则会按照指定的列进行分组。分组的顺序是从左到右。 4. **HAVING子句**:...

    ORACLE-Select语句执行顺序及如何提高Oracle基本查询效率.pdf

    ORACLE-Select语句执行顺序及如何提高Oracle基本查询效率 在Oracle中,SQL语句的执行顺序是非常重要的。了解了SQL语句的执行顺序,我们可以更好地优化SQL语句,提高查询效率。下面我们将详细介绍ORACLE-Select语句...

    更改Oracle表中字段的顺序的终极方法

    ### 更改Oracle表中字段顺序的方法 在Oracle数据库管理中,有时我们可能需要对表中的字段顺序进行调整。然而,通常的做法是通过备份、删除原表并重建来达到这一目的,这种方法不仅耗时而且繁琐。幸运的是,经过一番...

    08.Oracle的where子句1

    虽然存在优先级规则,但为了避免混淆,通常建议使用括号明确表达式执行顺序。 WHERE子句的运用非常广泛,可以通过组合不同的字段、比较运算符和逻辑运算符,实现对复杂查询需求的支持。在实际的数据库管理工作中,...

    oracle 查看当前会话执行的sql语句

    ### Oracle 查看当前会话执行的SQL语句 在Oracle数据库管理中,有时我们需要了解某个特定会话(Session)正在执行哪些SQL语句。这在性能调优、问题诊断等场景下尤为重要。以下将详细介绍如何通过不同的方法来查看...

    ORACLE 优化sql语句提高oracle执行效率 .doc

    2. WHERE 子句中的连接顺序:Oracle 采用自下而上的顺序解析 WHERE 子句。因此,表之间的连接必须写在其他 WHERE 条件之前,那些可以过滤掉最大数量记录的条件必须写在 WHERE 子句的末尾。 3. SELECT 子句中避免...

    oracle select执行顺序的详解

    SQL Select语句完整的执行顺序:1、from子句组装来自不同数据源的数据;2、where子句基于指定的条件对记录行进行筛选;3、group by子句将数据划分为多个分组;4、使用聚集函数进行计算;5、使用having子句筛选分组;...

    oracle数据库表中修改字段的顺序

    ### Oracle数据库表中修改字段顺序的方法 在Oracle数据库中,我们常常会遇到需要调整表中字段顺序的情况。例如,为了优化查询效率或是更好地符合业务逻辑,我们可能希望更改某些字段的位置。在过去,如果想要改变一...

    oracle执行计划文档

    它揭示了Oracle数据库如何执行SQL语句的详细步骤,包括数据的获取方式、处理顺序以及使用的索引等信息。以下是对执行计划中涉及的一些核心概念的详细解释: 1. **Rowid**: Rowid是一个唯一标识数据库中每行数据的...

    SQL查询原理及执行顺序

    ### SQL查询原理及执行顺序详解 SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言,其查询原理和执行顺序对于数据库性能优化至关重要。本文将深入探讨SQL查询的执行过程,帮助读者理解如何...

    深入Oracle的left join中on和where的区别详解

    今天遇到一个求某月所有天数的统计结果,如果某日的结果是0也需要显示出来...一开始我用的左连接,用on做为两表关联条件,用where作为过滤条件,但是发现0的数据根本不显示,后来把where关键字去掉,把过滤条件都放到on

    oracle执行计划建立与阅读

    2. **执行顺序(Execution Order)**:显示了Oracle执行各个操作的顺序。 3. **成本(Cost)**:优化器预估的执行每个操作所需的CPU和I/O资源的成本。 4. **行源(Rows Produced)**:预计每一步将返回多少行数据...

    ORACLE执行计划和SQL调优.pptx

    Predicate 是查询中的 WHERE 限制条件。Row Source 和 Predicate 是执行计划中两个非常重要的概念。 Driving Table 概念 Driving Table 又称为外层表,是执行计划中描述如何访问数据库中的数据的表。Driving Table...

    在Oracle里加快SQL执行的三种方法

    例如,如Listing A所示的查询,通过使用"ordered"提示,我们可以强制Oracle按照WHERE子句中的顺序进行评估。 其次,"ordered_predicates"提示则用于控制WHERE子句中布尔判断的评估顺序。Oracle默认的评估规则可能会...

    提高Oracle中SQL的执行效率

    本文将详细介绍几种有效的方法来提高Oracle中SQL的执行效率,包括选择合适的表名顺序、优化WHERE子句中的连接顺序、减少不必要的数据库访问等策略。 #### 1. 选择最有效率的表名顺序 在基于规则的优化器中,Oracle...

    Oracle+SQL性能优化40条.docx

    * Oracle 采用自下而上或自右向左的顺序解析 WHERE 子句 * 表之间的连接必须写在其他 WHERE 条件之前 七、SELECT 子句中避免使用“*” * Oracle 在解析 SQL 语句的时候,对于“*”将通过查询数据库字典来将其转换...

    Oracle数据库关于SQL的执行计划

    - **查询条件不匹配**:如果 WHERE 子句中的条件与索引的列顺序不一致,或者使用了函数操作,也可能导致索引无法被有效利用。 - **表扫描成本较低**:对于较小的表,全表扫描的成本可能比使用索引更低,尤其是在...

    Oracle 执行计划与查询优化

    了解并分析这些概念,有助于我们制定有效的查询优化策略,例如创建适当的索引、调整连接顺序、优化谓词条件等,从而提升Oracle数据库的整体性能。在实际工作中,可以使用EXPLAIN PLAN或SQL Trace等工具来查看和分析...

    sql解析顺序

    在这篇文章中,我们将详细地讲述 SQL 语句的解析顺序,包括 FROM、WHERE、GROUP BY、HAVING、SELECT 等子句的执行顺序。 首先,FROM 子句是 SQL 语句的第一步骤,它标识了需要查询的表,并生成一个虚拟表 VT1。FROM...

Global site tag (gtag.js) - Google Analytics