比如:select * from table a where a.name='gg' and a.age > 20;这样一条sql  oracle执行的时候是否先查询 name='gg' 的数据集  然后再这个数据集再去查找符合age》20的记录?

解决方案 »

  1.   

    1.假设这两个字段都没有索引,
    2.都有索引
    3.name有  age没有
    4.age有name没有。
    name='gg' 的记录集有 20w
    age>20 的有60w 
    我想知道这一块oracle会自动处理还是需要我们将条件顺序必须写好。
    刚接触oracle  大家帮帮忙
      

  2.   

    先检索from后面的,然后where后面的条件过滤,如果有and,他们其实是一种并行的,没有先后。
      

  3.   

    如果是基于规则的,从右到左的解析顺序
    如果是基于开销的,优化器会依据索引,表的信息选择最小的开销进行优化.
    oracle10g及以上默认是基于开销的,会自动优化.
      

  4.   

    正常情况下先从age > 20做条件过滤
      

  5.   


    /*
    SQL 的解析顺序为:
       (1).FROM 子句, 组装来自不同数据源的数据
       (2).WHERE 子句, 基于指定的条件对记录进行筛选
       (3).GROUP BY 子句, 将数据划分为多个分组
       (4).使用聚合函数进行计算
       (5).使用 HAVING 子句筛选分组
       (6).计算所有的表达式
       (7).使用 ORDER BY 对结果集进行排序
       举例说明: 在学生成绩表中 (暂记为 tb_Grade), 把 "考生姓名"内容不为空的记录按照 "考生姓名" 分组, 并且筛选分组结果, 选出 "总成绩" 大于 600 分的.
       顺序的 SQL 语句为: 
       select 考生姓名, max(总成绩) as max总成绩
       from tb_Grade
       where 考生姓名 is not null
       group by 考生姓名
       having max(总成绩) > 600
       order by max总成绩
       
       在上面的示例中 SQL 语句的执行顺序如下:
       (1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据
       (2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据
       (3). 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组
       (4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值
       (5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的.
       (7). 执行 ORDER BY 子句, 把最后的结果按 "Max 成绩" 进行排序.
    */
      

  6.   

    我觉得正常的情况下会先执行,name='gg' 然后再会执行别的。
    这个顺序主要是和Oracle收集的统计信息有关,如果Oracle收集到足够的统计信息的时候他会自动选择
    好的执行顺序,不是你写在前面就先执行,具体的你可以收集下统计信息,然后看详细的执行计划。
    一般按照树的方式,从叶子向根执行。
      

  7.   

    应该是从右到左的执行顺序,不然就不会衍生出SQL查询优化了,
    所以应该是先找出符合age的所有记录再去筛选name.
      

  8.   

    explain plan for 你的SQL语句
      

  9.   

    RBO是从右到左,CBO是看你的统计信息