- 浏览: 7973 次
- 性别:
- 来自: 深圳
最新评论
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>
使用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学习的知识点
2015-10-22 10:02 0Oracle学习的知识点 1、SQL、PL/SQL 2、Or ... -
索引讲解
2015-10-22 09:54 01.1 索引概念 索引是对 ... -
修改oracle为归档模式
2015-10-20 20:29 0修改oracle为归档模式 1,查看是否为归档模式 SQL ... -
SQLPLUS下显示CLOB中的内容
2015-10-20 20:29 0SQLPLUS下显示CLOB中的内容 create tabl ... -
捕捉批量写入错误信息-定位到某行
2015-10-20 20:29 0insert into select 批量加载出错解决方案 ... -
使用索引搜索字段为空的记录
2015-10-20 20:28 0使用索引搜索字段为空的记录 昨天下午时发现监控告警,数据库的 ... -
Oracle体系结构详细图解
2015-10-20 20:28 0Oracle体系结构详细图解 ... -
关于shared pool的深入探讨
2015-10-20 20:28 0关于shared pool的深入探讨(一) 关于shared ... -
表与索引的分析及索引重建(compute statistics,rebuild)
2015-10-20 20:27 0表与索引的分析及索引重建(compute statistics ... -
kill session会话不释放的问题
2015-10-20 20:26 0kill session会话不释放的问题 一般情况下,在杀一 ... -
动态性能视图 - v$mystat,v$sesstat,v$statname
2015-10-20 20:26 0动态性能视图 - v$mystat,v$sesstat,v$s ... -
Oracle直接路径加载--append的深度解析
2015-10-20 20:25 0Oracle直接路径加载--append的深度解析 ㈠ 直接 ... -
Oracle insert /*+ APPEND */原理解析
2015-10-20 20:25 0Oracle insert /*+ APPEND */原理解析 ... -
数据库容灾及数据中心(DC)解决方案
2015-10-20 20:25 0第一章 需求分析 1.1 系 ... -
数据库在线备份原理
2015-10-20 20:24 0Oracle数据库在线备份原理 1前言 本文从ORA ... -
DBMS_COMPARISON 数据对比
2015-10-20 20:24 0DBMS_COMPARISON 数据对比 参考: http: ... -
exp :EXP-00091 以及sqlplus乱码
2015-10-20 20:24 0exp :EXP-00091 以及sqlplus乱码 對一個 ... -
全文检索数据库环境配置
2015-10-20 20:23 0Oracle全文检索 1、检查O7_DICTIONARY_A ... -
IOT(Index Organized Table)简述
2015-10-20 20:23 0IOT(Index Organized Table)简述 对 ... -
45个非常有用的 Oracle 查询语句
2015-10-20 20:22 045个非常有用的 Oracle 查 ...
相关推荐
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...
orACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...
选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你...
ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...
Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,您必须选择记录条数最少的表作为基础表。假如有3个以上的表...
一. 简答题(每小题5分,共60分) 1. SQL包括哪三个子语言?...From子句,where子句,group by子句,having子句,select子句,order by子句; 执行顺序:from->where->group by->having->->select->oeder by。
ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理 在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表 当...
选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况...
在FROM后面的表中的列表顺序会对SQL执行性能影响,在没有索引及ORACLE没有对表进行统计分析的情况下ORACLE会按表出现的顺序进行链接,由此因为表的顺序不对会产生十分耗服务器资源的数据交叉。(注:如果对表进行...
SQLSERVER的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表,当SQLSERVER...
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...
Oracle按照从右到左的顺序对数据表进行解析。因此From最后面的表为基础表,一般要选择记录数最少的表作为基础表。 对于Where条件的顺序,过滤到最大查询记录数量的条件必须写在Where条件的结尾处。 Where条件...
SQLite Unions 子句 SQLite的 UNION 子句/运算符用于合并两个或多个 SELECT 语句的结果,不返回任何...FROM table1 [, table2 ] [WHERE condition] UNION SELECT column1 [, column2 ] FROM table1 [, table2 ] [WH