`

From子句的Table顺序对性能的影响

阅读更多
From子句的Table顺序对性能的影响(仅限RBO)

使用CBO时,编写SQL语句时,不必考虑"FROM" 子句后面的表或视图的顺序和"WHERE"子句后面的条件顺序。数据库会对表和索引进行分析,产生一些表和索引的统计信息。CBO会根据数据库收集到的表信息和索引信息,来决定SQL执行的最佳路径。也就是说,在CBO模式下From子句的Table顺序对性能没有任何影响。数据库会生成多种执行计划,并根据表信息和索引信息,来判断最佳的执行计划。

使用RBO时,Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.


上面提到的from后面表的顺序是从右向左解析执行没有问题,我们可以从执行计划中看到,但是把小表放在最右边似乎更慢了,不知道是什么原因?
SQL> desc t_t1
名称                                      是否为空? 类型
----------------------------------------- -------- ----------------------------

OWNER                                     NOT NULL VARCHAR2(30)
TABLE_NAME                                NOT NULL VARCHAR2(30)

SQL> desc t_t2;
名称                                      是否为空? 类型
----------------------------------------- -------- ----------------------------

OWNER                                              VARCHAR2(30)
TABLE_NAME                                         VARCHAR2(30)
COLUMN_NAME                                        VARCHAR2(30)

SQL> select count(*) from t_t1;

  COUNT(*)
----------
      3170

已用时间:  00: 00: 00.00
SQL> select count(*) from t_t2;

  COUNT(*)
----------
     71212

已用时间:  00: 00: 00.01
SQL> select count(*) from t_t2 a , t_t1 b where a.table_name = b.table_name;

  COUNT(*)
----------
     58083

已用时间:  00: 00: 00.07
SQL> select count(*) from t_t1 a , t_t2 b where a.table_name = b.table_name;

  COUNT(*)
----------
     58083

已用时间:  00: 00: 00.05
SQL> set autotrace on
SQL> select count(*) from t_t2 a , t_t1 b where a.table_name = b.table_name;

  COUNT(*)
----------
     58083

已用时间:  00: 00: 00.08

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   SORT (AGGREGATE)
   2    1     MERGE JOIN
   3    2       SORT (JOIN)
   4    3         TABLE ACCESS (FULL) OF 'T_T1'
   5    2       SORT (JOIN)
   6    5         TABLE ACCESS (FULL) OF 'T_T2'




Statistics
----------------------------------------------------------
          0  recursive calls
          7  db block gets
        382  consistent gets
        668  physical reads
          0  redo size
        382  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          1  sorts (disk)
          1  rows processed

SQL> select count(*) from t_t1 a , t_t2 b where a.table_name = b.table_name;

  COUNT(*)
----------
     58083

已用时间:  00: 00: 00.07

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   SORT (AGGREGATE)
   2    1     MERGE JOIN
   3    2       SORT (JOIN)
   4    3         TABLE ACCESS (FULL) OF 'T_T2'
   5    2       SORT (JOIN)
   6    5         TABLE ACCESS (FULL) OF 'T_T1'




Statistics
----------------------------------------------------------
          0  recursive calls
          5  db block gets
        382  consistent gets
        485  physical reads
          0  redo size
        382  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          1  sorts (disk)
          1  rows processed

===================================================]
SQL> select count(*) from tt;

  COUNT(*)
----------
         7

已用时间:  00: 00: 00.00
SQL> select count(*) from t_t2;

  COUNT(*)
----------
     71212

已用时间:  00: 00: 00.01

SQL> select count(*) from t_t2 , tt;

  COUNT(*)
----------
    498484

已用时间:  00: 00: 00.03
SQL> select count(*) from tt , t_t2;

  COUNT(*)
----------
    498484

已用时间:  00: 00: 00.02
SQL>
分享到:
评论

相关推荐

    Oracle SQL性能优化

    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    Oracle Sql 性能优化

    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    ORACLE_SQL性能优化

    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    oracle语句优化方法.txt

    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    SQL语句优化的34条建议

    orACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    ORACLE_SQL语句优化技术分析

    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    Oracle_SQL优化

    选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你...

    多年的 SQL 优化经验

    ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    oracle SQL性能优化

    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    Orcle面试知识点

    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    ORACLE优化SQL语句,提高效率

     Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,您必须选择记录条数最少的表作为基础表。假如有3个以上的表...

    西南交通大学第四章-数据库作业.docx

    一. 简答题(每小题5分,共60分) 1. SQL包括哪三个子语言?...From子句,where子句,group by子句,having子句,select子句,order by子句; 执行顺序:from->where->group by->having->->select->oeder by。

    SQL数据库资源大放送

    ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    SQL编写规范(数据库操作规范)

     ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理    在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表    当...

    Oracle SQL性能优化系列学习二

     选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况...

    SQL性能优化

     在FROM后面的表中的列表顺序会对SQL执行性能影响,在没有索引及ORACLE没有对表进行统计分析的情况下ORACLE会按表出现的顺序进行链接,由此因为表的顺序不对会产生十分耗服务器资源的数据交叉。(注:如果对表进行...

    SQLSERVER SQL性能优化技巧

    SQLSERVER的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表,当SQLSERVER...

    Oracle之SQL语句性能优化(34条优化方法)

    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    oracle的sql优化

     Oracle按照从右到左的顺序对数据表进行解析。因此From最后面的表为基础表,一般要选择记录数最少的表作为基础表。  对于Where条件的顺序,过滤到最大查询记录数量的条件必须写在Where条件的结尾处。  Where条件...

    SQLite Unions 子句

    SQLite Unions 子句 SQLite的 UNION 子句/运算符用于合并两个或多个 SELECT 语句的结果,不返回任何...FROM table1 [, table2 ] [WHERE condition] UNION SELECT column1 [, column2 ] FROM table1 [, table2 ] [WH

Global site tag (gtag.js) - Google Analytics