Oracle查询转换(五)子查询展开
子查询展开是指优化器将子查询转换为等价的表连接,从而提高查询效率。如果子查询前的where条件为: ● =、、=、 ● EXISTS、IN、ANY ● NOT EXISTS、NOT IN、ALL则目标SQL就有可能会做子查询展开。 来看一个简单的例子:SQL> select employee_id,last_name from employees where empl...
Oracle查询转换(四)连接谓词推入
在前面 Oracle查询转换(二)复杂视图合并 中有一个例子: SQL> select /*+ no_merge(e) */d.department_name,e.sal_sum from employees_vw e,departments d where e.department_id=d.department_id and department_name='IT'; Execution Plan----------------------------------------------------------Plan hash value: ...
Oracle查询转换(三)外连接视图合并
视图的定义及分类参考:http://blog.itpub.net/28536251/viewspace-1871039/如果视图定义中包含外连接或者视图与目标SQL中其他表做外连接,优化器会评估视图合并后的语义是否与目标SQL一致,如果一致就进行视图合并,也就是外连接视图合并。那么什么情况下语义一致呢,有以下两种情况: ● 视图的基表只有一个表。&nb...
Oracle查询转换(二)复杂视图合并
视图的定义及分类参考:http://blog.itpub.net/28536251/viewspace-1871039/如果目标SQL中包含了视图,且该视图为一个复杂视图,则优化器会评估视图合并的成本,如果成本低于原SQL的成本,才会做视图合并。 创建一个复杂视图:SQL> create view employees_vw as select department_id,sum(salary) sal_sum from empl...
Oracle查询转换(一)简单视图合并
视图的定义及分类参考:http://blog.itpub.net/28536251/viewspace-1871039/如果目标SQL中包含了视图,且该视图为一个简单视图,则优化器会将视图拆开,直接使用视图的基表来生成执行计划,故在执行计划中将看不到视图的名字了。 创建一个简单视图:SQL> create view employees_50_vw as select employee_id,...
Oracle的表连接方法(七)
Oracle表连接方法有四种: ● 排序合并连接(Sort Merge Join) ● 嵌套循环连接(Nested Loops Join) ● 哈希连接(Hash Join) ● 笛卡尔积(Cartesian Product) 如果where条件有not exists、not in或all操作符+子查询,则Oracle会将其处理为反连接,,执行计划中对应的关键字为anti。 SQL> ...
Oracle的表连接方法(六)
Oracle表连接方法有四种: ● 排序合并连接(Sort Merge Join) ● 嵌套循环连接(Nested Loops Join) ● 哈希连接(Hash Join) ● 笛卡尔积(Cartesian Product) 如果where条件有exists、in或=any操作符+子查询,则Oracle会将其处理为半连接,执行计划中对应的关键字为SEMI。 SQ...
Oracle的表连接方法(五)
Oracle表连接方法有四种: ● 排序合并连接(Sort Merge Join) ● 嵌套循环连接(Nested Loops Join) ● 哈希连接(Hash Join) ● 笛卡尔积(Cartesian Product) 前面连接方法的示例都是内连接,我们知道Oracle还有外连接,包括左外连接,右外连接和全外连接。执行计划中左外连接和右外...
Oracle的表连接方法(四)笛卡尔积
Oracle表连接方法有四种: ● 排序合并连接(Sort Merge Join) ● 嵌套循环连接(Nested Loops Join) ● 哈希连接(Hash Join) ● 笛卡尔积(Cartesian Product) 如果两个表做表连接而没有连接条件,而会产生笛卡尔积,在实际工作中应该尽可能避免笛卡尔积。笛卡尔积对应的执行计划中有...
Oracle的表连接方法(三)哈希连接
Oracle表连接方法有四种: ● 排序合并连接(Sort Merge Join) ● 嵌套循环连接(Nested Loops Join) ● 哈希连接(Hash Join) ● 笛卡尔积(Cartesian Product) 如果两个表对应的结果集很大,使用排序合并的话,排序操作成本较高;使用嵌套循环的话,则循环次数又很多,需要多次访问被驱动表...
Oracle的表连接方法(二)嵌套循环连接
Oracle表连接方法有四种: ● 排序合并连接(Sort Merge Join) ● 嵌套循环连接(Nested Loops Join) ● 哈希连接(Hash Join) ● 笛卡尔积(Cartesian Product) 嵌套循环连接是Oracle将连接的两个表根据结果集的大小,决定出驱动表和被驱动表。结果集小的作为驱动表,结果集大的作为被...
Oracle的表连接方法(一)排序合并连接
Oracle表连接方法有四种: ● 排序合并连接(Sort Merge Join) ● 嵌套循环连接(Nested Loops Join) ● 哈希连接(Hash Join) ● 笛卡尔积(Cartesian Product) 排序合并连接是将连接的两个表使用连接列排序后,对排序后的结果集进行合并后再得到匹配记录。如果连接列上面有索引,可以...
Oracle访问索引的执行计划(五)
Oracle访问索引的执行计划(一)Oracle访问索引的执行计划(二)Oracle访问索引的执行计划(三)Oracle访问索引的执行计划(四) 对于复合索引,如果前导列的不同值很少,而非前导列的不同值很多,那么在查询谓词条件中没有指定复合索引的前导列,则可能会使用上索引跳跃扫描(INDEX SKIP SCAN)。 SQL> create tabl...
Oracle访问索引的执行计划(四)
Oracle访问索引的执行计划(一)Oracle访问索引的执行计划(二)Oracle访问索引的执行计划(三) 如果目标表比较大,相关字段上有索引,根据CBO,Oracle可能会使用索引快速全扫描(INDEX FAST FULL SCAN)来扫描索引,提高访问速度。索引快速全扫描使用多块读,可以并行执行,结果是无序的。产生db file scattered r...
Oracle访问索引的执行计划(三)
Oracle访问索引的执行计划(一)Oracle访问索引的执行计划(二) 当需要获取某个字段的全部数据时,如果该字段非空且有索引,或者通过where条件将空值排除掉,则可能会使用索引全扫描(INDEX FULL SCAN)。 查看HR用户下EMPLOYEES表的LAST_NAME字段的索引,为非唯一索引。SQL> select a.table_name,column_name,a.in...
Oracle访问索引的执行计划(二)
Oracle访问索引的执行计划(一) 如果目标SQL对有唯一索引字段指定范围where条件,则会使用索引范围扫描,而对于非唯一索引字段,不管指定什么where条件,均不会使用索引唯一扫描。索引范围扫描的执行计划为INDEX RANGE SCAN。 查看HR用户下EMPLOYEES表的EMPLOYEE_ID字段的索引,为唯一索引。SQL> select a.table_na...
Oracle访问索引的执行计划(一)
Oracle中常用的索引有B树索引和位图索引,先来看B树索引。访问B树索引也有很多方式,最简单的是索引唯一扫描,出现在where条件的字段有唯一索引,且使用等值查询的时候,返回的记录也只有1条。索引唯一扫描的执行计划为INDEX UNIQUE SCAN。 查看HR用户下EMPLOYEES表的EMPLOYEE_ID字段的索引,为唯一索引。SQL> selec...
Oracle访问表的执行计划
Oracle访问表的方法有2种。一种是全表扫描,使用多块读,需要读取该表高水位下的所有块。对应的执行计划为TABLE ACCESS FULL。SQL> select * from employees; 107 rows selected. Execution Plan----------------------------------------------------------Plan hash value: 1445457117 ---------------------------------...
Oracle查看执行计划(六)
前面讲了五种查看Oracle目标SQL执行计划的方法:Oracle查看执行计划(一)Oracle查看执行计划(二)Oracle查看执行计划(三)Oracle查看执行计划(四)Oracle查看执行计划(五)其中第一种和第二种在目标SQL使用了绑定变量的情况下,获得的执行计划有可能是不准的。创建测试表:SQL> create table test1 as selec...
Oracle查看执行计划(五)
如果想查看执行计划中每一步耗费的逻辑读、物理读和花费的时间,那么就需要使用10046事件来得到目标SQL的执行计划。步骤如下:(1)设置生成的trace文件标识SQL> alter session set tracefile_identifier='stone';Session altered.(2)激活10046事件SQL> oradebug setmypidStatement processed.SQL> oradebug ...