SlideShare a Scribd company logo
1 of 26
Optimizer operators
1.行源操作
1.Unary Operations:一元运算,即单表的查询;
2.Binary Operations:二元运算,两表的连接;
3.N-ary Operations:多元运算;
2.主要的结构和访问路径:
1.表:
1.Full Table Scan;
2.Rowid Scan:很少使用,多用在内部的某一个步骤;
3.Sample Table Scan:很少使用;
2.索引:
1.Index Scan(Unique);
2.Index Scan(Range);
3.Index Scan(Full);
4.Index Scan(Fast Full);
5.Index Scan(Skip);
6.Index Scan(Index Join);
7.Using Bitmap Indexes;
8.Combining Bitmap Indexes;
3.索引的基本概念:
1.B-Tree Indexes:平衡树索引,最常见的索引;
1.正常索
引;
2.基于函数的索引:
1.创建函数索引相当于在表上添加一个伪
列;
2.查看定
义;
3.IOT(Index-Organized Table):将表结构整体
放入索引中,而且按照主键进行排序,一定要有主键,
非主键的列一定要落在索引条目里;
4.Bitmap Indexes;
1.可以索引空值;
2.适当发生转换:TO ROWIDS/FROM
ROWIDS/COUNT;
3.可以进行的操
作:MERGE/AND/OR/MINUS/KEY
ITERATION,位运算的速度很快;
4.位图索引可以进行 SINGLE VALUE/ RANGE
SCAN/ FULL SCAN 扫描;
5.缺点是位图索引不能经常更新,效率很差;
5.Cluster Indexes;
1.如果要做两个表的关联查询则最少查询两个
块;
2.CLUSTER 把两个表按照关联的字段把记录存
放在同一个块上;这样只用查一个块即可;查
找时效率提高一倍;
3.用在总是关联查询两个表的情况,一般是不用
的;ORACLE 内部大量使用;
4.cluster 上的索引不能指定列,必须使用所有
的列;
5.基于 cluster 的表没有 segment;
2.索引的属性:
1.键压缩;
2.反转键值(考点):可以防止索引块争用(buffer
busy wait),只支持等式连接,不支持范围扫描;
3.顺序/倒序;
3.索引和 NULL 值:
1.NULL 值与索引的关系:
1.基于单列的唯一索引,可以多次插入 NULL 值
(NULL <> NULL),因为索引并不存储 NULL
值;
2.基于多列的符合索引,尽管全为 NULL 的值可
以多次插入([NULL, NULL] <> [NULL,
NULL]),索引也不会存储,但不全为 NULL 的
重复行则不能重复插入,;
2.NULL 值与执行计划:
1.如果列的属性允许为 NULL,条件为 IS NULL
的话,肯定走全表扫描,因为索引不保存 NULL
值;
2.如果列的属性允许为 NULL,条件为 IS NOT
NULL 的话,会走全索引扫描;
3.如果列的属性为 NOT NULL,条件为 IS [NOT]
NULL 的话,走索引扫描;
4.组合索引的话,如果条件中只出现一列的话跟
单列索引一样;
5.组合索引的话,如果条件中出现两列,会优先
选择走索引;
3.IS NULL 使用索引的办法:
1.在 NULL 的列上创建函数索
引:nvl(column_name, -1),查询的时候条
件指定函数索引:
where nvl(column_name, -1) = -1;
2.为 NULL 的列添加默认值;
4.索引的管理:
1.插入数据后再创建索引,对于 DW 来言;
2.在适当的表和列上加索引;
3.注意组合索引的顺序;
4.控制索引的数量:每添加一个索引,DML 的效率下降
3 倍,官方推荐最多加 7 个索引;
5.删除不使用的索引;
6.为索引指定单独的表空间;
7.创建索引时使用并行,NOLOGGING 参数;
8.COALESCING 是合并相邻叶子节点,rebuild 则可
以减少索引树的高度;
5.检测索引是否被使用了:
1.添加对某个索引的监控:ALTER INDEX
EMP_EMP_ID_PK MONITORING USAGE;
2.查看监视的对象使用情况:SELECT * FROM
v$object_usage;默认是没有任何的监视
的;
3.使用此索引后再查
看;
4.取消索引监控:ALTER INDEX EMP_EMP_ID_PK
NOMONITORING
USAGE;
5.缺点:每次只能添加一个索引,而且不记录索引使用
的次数;
6.不使用索引的原因:
1.被检索的列上用了函数;
2.数据类型不匹配;发生隐士转换是转化左边的
列,而不是右边的列;
3.统计信息是否最新;
4.列是否是空值;
5.索引效率太低;
4.各种访问路径的原理及使用场景:
1.Full Table Scan:
1.会执行 Multiblock Reads,参考初始化参
数:db_file_multiblock_read_count;
2.会读取 HWM(High-Water Mark)以下所有被格式
化的块;
3.过程中可能会过滤某些记录;
4.用在要获得大量记录的时候,比索引扫描更快;
5.使用的场景:
1.没有合适的索引;
2.过滤条件不好,甚至是没有过滤条件;
3.表太小,记录数很少;
4.需要并行扫描,并行扫描一定不走索引,如果
确定是全表的话可以考虑并行:SELECT /*+
PARALLEL(d 4) */ * FROM departments
d;
5.加全表扫描的 hint 时:SELECT /*+ FULL
(d)*/ * FROM departments d WHERE
department_id =
10;
6.IS NULL 的操
作;
2.ROWID Scan:
1.根据记录的 rowid 查询,最快的访问方式,但不经常
使用,可能会出现在执行计划的某个步骤中;
2.使用的方
法:
3.Sample Table Sacns:基本不用,SELECT * FROM
departments SAMPLE BLOCK (10) SEED (1);
4.Index Unique Scan:条件中指定了主键列或者唯一键的
列就走唯一键扫
描;
5.Index Range Sacn:
1.过滤的条件上不是主键/唯一索引,就会走索引范围
扫
描;
2.如果对有索引的列排倒序就会有索引倒序扫描;(因
为索引本身是排序的,所以执行计划中不会有排序的
步骤,按照索引列排序效率会
高;)
3.走函数索引的例子,也是索引范围扫描的一
种;
6.Index Full Sacn vs Index Fast Full Sacn:
1.出现的条件:
1.SELECT 与 WHERE 子句出现的所有的列必须存
在索引,而且为非空列,因为索引不存放 NULL
值;
2.返回的数据总行占据索引的 10%以上的比例;
2.Index Full Sacn:
1.完全按照索引存储的顺序依次访问整个索引树,
当访问到叶子节点时,按照双向链表方式读取
相连的节点值;
2.使用 Single Read,会产生 db file
sequential reads 事件;
3.对于索引列上的排序,总是会使用 Index
Full Scan;
4.索引列上 is not null 的操作,会走全索引
扫描;
3.Index Fast Full Sacn:
1.对于索引的分支结构只是简单的获取,然后扫
描所有的叶节点,导致索引结构没有访问,获
得的数据没有根据索引键的顺序排序,读取效
率高.但是如果 SQL 语句中有排序操作的话,
还要额外多做一次排序;
2.在使用 Index Fast Full Sacn 时,使用
Multiblock Read,会产生 db file
scattered
reads,db_file_multiblock_read_cou
nt 参数的设置很重要;
3.统计行数,如 count(*)的操作总是会使用
Index [Fast] Full Scan 的;
4.会使用大量的内存和 CPU 资源;
4.Index [Fast] Full Scan 的例
子;
7.Index Skip Scan:
1.创建了复合索引,但是条件中只有复合索引中的第二
列,而且当第一列的 distinct 值不多时,会发生跳
跃扫描;
2.创建一个测试表,和一个联合索引,当第一列可选值
少而条件中只查找第二列时,发生跳越扫
描;
3.如果第一列的可选值很多,条件中查找第二列的话,
发生全表扫
描;
8.Index Join Scan:查询的列都不为空,而且都有索引才
会出现联合扫
描;
9.AND-EQUAL 操作:两列都有索引,分别扫描两列获得记录
的 rowid,然后再取 rowid 的交集;
10. Bitmap Index:
1.Bitmap 的单值扫
描;
2.Bitmap 的范围扫
描;
3.Bitmap 的迭代操作操
作;
4.Bitmap 的 AND 操
作;
5.排序操作:
1.Sort Operator:
1.AGGREGATE:在 group 操作用会用到,统计结果;
2.UNIQUE:评估是否重复;
3.JOIN:做合并操作;
4.GROUP BY,ORDER BY:在 group by 和 order by
的时候使用;
2.Hash Operator:
1.GROUP BY:在 group by 操作时使用;
2.UNIQUE:跟 SORT UNIQUE 一样;
3.10g 之后结果默认不排序,如果想要排序后的结果,应该总
是使用 ORDER BY 字句;
6.Buffer Sort:
1.BUFFER SORT 不是一种排序,而是一种临时表的创建方
式;
2.BUFFER 表示在内存中存放了一张临时表;
3.SORT 来修饰 BUFFER 表示具体再内存的什么地方:在 PGA
的 SQL 工作区的排序区;
4.BUFFER SORT 的例
子:
7.INLIST ITERATOR:
1.是由于 IN 操作引起的,要关注迭代的次数,一次迭代就要
有一次访问,如果没有索引可能性能问题会很严重;
2.可以使用 UNION ALL 操作代替;
3.INLIST ITERATOR 的例
子;
8.视图的操作:
1.Merge View:是将 View 的定义和外部查询合并,高效的
方式;
2.No Merge View:先将 View 的数据取出来再做外部条件
的过滤,效率低;
9.执行计划中的 Count 和 Count Stopkey:oracle 数据库的优
化关于 rownum 操作;
1.在查询中有时使用到伪列 rownum,对使用伪列 rownum 的
查询,优化器要么使用 count 操作,要么使用 count
stopkey 操作来对 rownum 计数器进行增量(注意:这里的
count 操作和 count stopkey 操作与 count 函数没有
任何关系).如果对 rownum 伪列应用一个限定条件,
如:where rownum<10,则使用 count stopkey 操作;
如果不为 Rownum 伪列指定限定条件,则是使用 count 操
作;
2.不在 Rownum 伪列上使用限定条件:SELECT
employee_id, ROWNUM FROM
employees;(employee_id 是主键)为了完成这个查询,
优化器执行一个全索引扫描(主键索引),后跟一个 count
操作生成每个行的 rownum 值,count 操作不需要等待得
到整个记录集,随着从 employee 表中返回记录,rownum
计数器进行增量,从而确定每个记录的 rownum;
3.在 rownum 伪列上使用一个限定:SELECT employee_id,
ROWNUM FROM employees WHERE ROWNUM < 10;为
了实施限定条件,优化器用 count stopkey 操作代替
count 操作,它将 rownum 伪列的增量值与限定条件中指
定的值进行比较,如果 rownum 伪列的值大于限定条件中
指定的值,则查询不再返回更多的行;
4.在 where 子句中不能使用 rownum>10 这样的操作,只能
使用 rownum<10 这样的操作;
10. Min/Max and First Row 操作:当使用 MAX/MIN 函数时
发
生;
11. 连接的方式:
1.一个连接定义了两个行源的关系,也是合并两个行源间数
据的方法;
2.主要由连接的谓词所控制,定义了对象间的关
系;
3.连接的方法:
1.Nested Loops:
1.对于被连接的数据子集较小的情况,嵌套循环
是个较好的选择;
2.返回第一条记录最快的方式;
3.这种情况下,内表被外表驱动,外表返回的每
一行都要在内表中检索找到它匹配的行,因此
整个查询返回的结果集不能太大(eg:<1w);
4.要把返回子集较小的表作为驱动表,而且内标
的连接字段上一定要有索引;
5.使用 USE_NL(table_name1 table_name2)
可是强制 CBO 执行嵌套循环连接;
2.Sort-Merge Join:
1.通常情况下散列连接的效果都比排序合并连接
要好,然而如果行源已经被排过序,在执行排
序合并连接时不需要再排序了,这时排序合并
连接的性能会优于散列连接;
2.可以使用 USE_MERGE(table_name1
table_name2)来强制使用排序合并连接;
3.Sort Merge join 使用的情况:
1.用在没有索引;
2.数据已经排序的情况;
3.不等价关联;
4.HASH_JOIN_ENABLED=FALSE;
3.Hash Join:
1.散列连接是 CBO 做大数据集连接时常用的方式,
优化器使用两个表中较小的表(行源)利用连
接键在内存中建立散列表,然后扫描较大的表
并探测散列表,找出与散列表匹配的行;
2.这种方式适用于较小的表完全可以放于内存中
的情况,这样总成本就是访问两个表的成本之
和,但是在表很大的情况下并不能完全放入内
存,这时优化器会将它分割成若干不同的分区,
不能放入内存的部分就把该分区写入磁盘的临
时段,此时要有较大的临时段从而尽量提高
I/O 的性能;
3.也可以用 USE_HASH(table_name1
table_name2)提示来强制使用散列连接,如
果使用散列连接 HASH_AREA_SIZE 初始化参
数必须足够的大,如果是 10g 以后,Oracle 建
议使用 SQL 工作区自动管理,设置
WORKAREA_SIZE_POLICY 为 AUTO,然后调
整 PGA_AGGREGATE_TARGET 即可;
4.连接方式的比较:
1.Hash join 的工作方式是将一个表(通常是小一点
的那个表)做 hash 运算,将列数据存储到 hash 列表
中,从另一个表中抽取记录,做 hash 运算,到 hash
列表中找到相应的值,做匹配;
2.Nested loops 工作方式是从一张表中读取数据,访
问另一张表(通常是索引)来做匹配,nested loops
适用的场合是当一个关联表比较小的时候,效率会更
高;
3.Merge Join 是先将关联表的关联列各自做排序,
然后从各自的排序表中抽取数据,到另一个排序表中
做匹配,因为 merge join 需要做更多的排序,所以
消耗的资源更多,通常来讲,能够使用 merge join
的地方,hash join 都可以发挥更好的性能,Merge
Join 太消耗 PGA;
5.连接的类型:
1.[不]等值连接和自然连接;
2.外连接:全连接,左外连接,右外连接;(外连接:+号
放那边,哪边记录少;)
3.半连接:EXISTS 子句;
4.反连接:NOT IN 字句;
12. 多行源的操作
1.FILTER;
2.CONCATENATION;
3.UNION [ALL]
4.INTERSECT;
5.MINUS;
-- Full Table Scan;
SELECT * FROM departments WHERE manager_id = 100;
SELECT /*+ PARALLEL(d 4) */ * FROM departments d;
SELECT * FROM departments d WHERE department_id = 10;
SELECT /*+ FULL (d)*/ * FROM departments d WHERE
department_id = 10;
-- ROWID Sacn;
SELECT * FROM departments WHERE ROWID =
'AAAMiZAAFAAAAA4AAI';
SELECT * FROM departments WHERE ROWID = (
SELECT rowid FROM departments WHERE
manager_id = 100);
-- 函数索引的例子;
CREATE INDEX idx_employees_fun_firstname ON employees
(upper(first_name));
SELECT * FROM user_tab_cols WHERE table_name =
'EMPLOYEES';
SELECT * FROM user_ind_expressions WHERE index_name =
'IDX_EMPLOYEES_FUN_FIRSTNAME';
-- Index Skip Scan 的例子;
CREATE TABLE skip_test AS
SELECT object_id, object_name, decode(object_type,
'VIEW', 'VIEW', 'TABLE') AS object_flag, object_type
FROM dba_objects WHERE ROWNUM <= 3000;
CREATE INDEX idx_skip_test ON skip_test(object_flag,
object_id);
EXEC dbms_stats.gather_table_stats(USER, 'skip_test',
CASCADE => TRUE);
SELECT * FROM skip_test WHERE object_id = 100;
-- 如果联合索引第一列的候选值太多,则发生全表扫描;
DROP INDEX idx_skip_test;
CREATE INDEX idx_skip_test ON skip_test(object_type,
object_id);
EXEC dbms_stats.gather_table_stats(USER, 'skip_test',
CASCADE => TRUE);
SELECT * FROM skip_test WHERE object_id=100;
-- 位图索引的例子;
CREATE TABLE bitmap_test AS
SELECT ROWNUM rn, MOD(ROWNUM, 4) bit,
CASE MOD(ROWNUM, 2) WHEN 0 THEN 'M' ELSE 'F' END
gender
FROM dual CONNECT BY ROWNUM < 1000;
CREATE BITMAP INDEX bmp_bitmap_bit on bitmap_test
(bit);
CREATE BITMAP INDEX bmp_bitmap_gender on bitmap_test
(gender);
EXEC dbms_stats.gather_table_stats(USER,
'bitmap_test', CASCADE => TRUE);
ALTER SESSION optimizer_mode = 'FIRST_ROWS_1000';
SELECT * FROM bitmap_test WHERE bit = 3;
SELECT * FROM bitmap_test WHERE bit > 2;
SELECT * FROM bitmap_test WHERE bit IN (2, 3);
SELECT * FROM bitmap_test WHERE bit IN (2, 3) AND gender
= 'M';

More Related Content

Viewers also liked

MySQL Fulltext Search Tutorial
MySQL Fulltext Search TutorialMySQL Fulltext Search Tutorial
MySQL Fulltext Search TutorialZhaoyang Wang
 
Installation and configuration 11g r2
Installation and configuration 11g r2Installation and configuration 11g r2
Installation and configuration 11g r2Zhaoyang Wang
 
SQL Tuning01-Introduction to SQL Tuning
SQL Tuning01-Introduction to SQL TuningSQL Tuning01-Introduction to SQL Tuning
SQL Tuning01-Introduction to SQL TuningZhaoyang Wang
 
MYSQLCLONE Introduction
MYSQLCLONE IntroductionMYSQLCLONE Introduction
MYSQLCLONE IntroductionZhaoyang Wang
 
SQL Tuning02-Intorduction to the CBO Optimizer
SQL Tuning02-Intorduction to the CBO OptimizerSQL Tuning02-Intorduction to the CBO Optimizer
SQL Tuning02-Intorduction to the CBO OptimizerZhaoyang Wang
 
Oracle enterprise manager cloud control 12c release 5 installation on oracle ...
Oracle enterprise manager cloud control 12c release 5 installation on oracle ...Oracle enterprise manager cloud control 12c release 5 installation on oracle ...
Oracle enterprise manager cloud control 12c release 5 installation on oracle ...Zhaoyang Wang
 
Data Organization in InnoDB
Data Organization in InnoDBData Organization in InnoDB
Data Organization in InnoDBZhaoyang Wang
 
Oracle Compute Cloud Service介绍
Oracle Compute Cloud Service介绍Oracle Compute Cloud Service介绍
Oracle Compute Cloud Service介绍Zhaoyang Wang
 
SQL Tuning04-Interpreting Execution Plans
SQL Tuning04-Interpreting Execution PlansSQL Tuning04-Interpreting Execution Plans
SQL Tuning04-Interpreting Execution PlansZhaoyang Wang
 
New awesome features in MySQL 5.7
New awesome features in MySQL 5.7New awesome features in MySQL 5.7
New awesome features in MySQL 5.7Zhaoyang Wang
 

Viewers also liked (12)

MySQL Fulltext Search Tutorial
MySQL Fulltext Search TutorialMySQL Fulltext Search Tutorial
MySQL Fulltext Search Tutorial
 
Why use MySQL
Why use MySQLWhy use MySQL
Why use MySQL
 
Installation and configuration 11g r2
Installation and configuration 11g r2Installation and configuration 11g r2
Installation and configuration 11g r2
 
个人介绍
个人介绍个人介绍
个人介绍
 
SQL Tuning01-Introduction to SQL Tuning
SQL Tuning01-Introduction to SQL TuningSQL Tuning01-Introduction to SQL Tuning
SQL Tuning01-Introduction to SQL Tuning
 
MYSQLCLONE Introduction
MYSQLCLONE IntroductionMYSQLCLONE Introduction
MYSQLCLONE Introduction
 
SQL Tuning02-Intorduction to the CBO Optimizer
SQL Tuning02-Intorduction to the CBO OptimizerSQL Tuning02-Intorduction to the CBO Optimizer
SQL Tuning02-Intorduction to the CBO Optimizer
 
Oracle enterprise manager cloud control 12c release 5 installation on oracle ...
Oracle enterprise manager cloud control 12c release 5 installation on oracle ...Oracle enterprise manager cloud control 12c release 5 installation on oracle ...
Oracle enterprise manager cloud control 12c release 5 installation on oracle ...
 
Data Organization in InnoDB
Data Organization in InnoDBData Organization in InnoDB
Data Organization in InnoDB
 
Oracle Compute Cloud Service介绍
Oracle Compute Cloud Service介绍Oracle Compute Cloud Service介绍
Oracle Compute Cloud Service介绍
 
SQL Tuning04-Interpreting Execution Plans
SQL Tuning04-Interpreting Execution PlansSQL Tuning04-Interpreting Execution Plans
SQL Tuning04-Interpreting Execution Plans
 
New awesome features in MySQL 5.7
New awesome features in MySQL 5.7New awesome features in MySQL 5.7
New awesome features in MySQL 5.7
 

Similar to Optimizer operators

iOS App 開發 -- Storybard 基礎練習、APP 上架、IAP
iOS App 開發 -- Storybard 基礎練習、APP 上架、IAPiOS App 開發 -- Storybard 基礎練習、APP 上架、IAP
iOS App 開發 -- Storybard 基礎練習、APP 上架、IAPMing-Sian Lin
 
Sql培训 (1)
Sql培训 (1)Sql培训 (1)
Sql培训 (1)jhao niu
 
Mongo db技术交流
Mongo db技术交流Mongo db技术交流
Mongo db技术交流liuts
 
MySQL查询优化浅析
MySQL查询优化浅析MySQL查询优化浅析
MySQL查询优化浅析frogd
 
Code style 2014-07-18-pub
Code style 2014-07-18-pubCode style 2014-07-18-pub
Code style 2014-07-18-pubpersia cai
 
Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享晓锋 陈
 
了解Oracle在线重定义online redefinition
了解Oracle在线重定义online redefinition了解Oracle在线重定义online redefinition
了解Oracle在线重定义online redefinitionmaclean liu
 
Arduino 底層原始碼解析心得
Arduino 底層原始碼解析心得Arduino 底層原始碼解析心得
Arduino 底層原始碼解析心得roboard
 
Er introduction
Er introductionEr introduction
Er introductionYubei Li
 
由一个简单的程序谈起――之二
由一个简单的程序谈起――之二由一个简单的程序谈起――之二
由一个简单的程序谈起――之二yiditushe
 
Customize renderpipeline
Customize renderpipelineCustomize renderpipeline
Customize renderpipelineAkilarLiao
 
Intorduction to the cbo optimizer
Intorduction to the cbo optimizerIntorduction to the cbo optimizer
Intorduction to the cbo optimizerZhaoyang Wang
 
不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会Joseph Chiang
 
配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制maclean liu
 
Arduino應用系統設計 - Arduino程式快速入門
Arduino應用系統設計 - Arduino程式快速入門Arduino應用系統設計 - Arduino程式快速入門
Arduino應用系統設計 - Arduino程式快速入門吳錫修 (ShyiShiou Wu)
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文Guo Albert
 

Similar to Optimizer operators (20)

Optimzing mysql
Optimzing mysqlOptimzing mysql
Optimzing mysql
 
Cch2v6
Cch2v6Cch2v6
Cch2v6
 
iOS App 開發 -- Storybard 基礎練習、APP 上架、IAP
iOS App 開發 -- Storybard 基礎練習、APP 上架、IAPiOS App 開發 -- Storybard 基礎練習、APP 上架、IAP
iOS App 開發 -- Storybard 基礎練習、APP 上架、IAP
 
Sql培训 (1)
Sql培训 (1)Sql培训 (1)
Sql培训 (1)
 
Mongo db技术交流
Mongo db技术交流Mongo db技术交流
Mongo db技术交流
 
MySQL查询优化浅析
MySQL查询优化浅析MySQL查询优化浅析
MySQL查询优化浅析
 
Code style 2014-07-18-pub
Code style 2014-07-18-pubCode style 2014-07-18-pub
Code style 2014-07-18-pub
 
Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享
 
了解Oracle在线重定义online redefinition
了解Oracle在线重定义online redefinition了解Oracle在线重定义online redefinition
了解Oracle在线重定义online redefinition
 
Arduino 底層原始碼解析心得
Arduino 底層原始碼解析心得Arduino 底層原始碼解析心得
Arduino 底層原始碼解析心得
 
Er introduction
Er introductionEr introduction
Er introduction
 
由一个简单的程序谈起――之二
由一个简单的程序谈起――之二由一个简单的程序谈起――之二
由一个简单的程序谈起――之二
 
Customize renderpipeline
Customize renderpipelineCustomize renderpipeline
Customize renderpipeline
 
Win dbg入门
Win dbg入门Win dbg入门
Win dbg入门
 
Windbg入门
Windbg入门Windbg入门
Windbg入门
 
Intorduction to the cbo optimizer
Intorduction to the cbo optimizerIntorduction to the cbo optimizer
Intorduction to the cbo optimizer
 
不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会
 
配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制
 
Arduino應用系統設計 - Arduino程式快速入門
Arduino應用系統設計 - Arduino程式快速入門Arduino應用系統設計 - Arduino程式快速入門
Arduino應用系統設計 - Arduino程式快速入門
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
 

More from Zhaoyang Wang

海通证券金融云思考与实践(数据技术嘉年华2017)
海通证券金融云思考与实践(数据技术嘉年华2017)海通证券金融云思考与实践(数据技术嘉年华2017)
海通证券金融云思考与实践(数据技术嘉年华2017)Zhaoyang Wang
 
云管理平台助力海通金融云建设
云管理平台助力海通金融云建设云管理平台助力海通金融云建设
云管理平台助力海通金融云建设Zhaoyang Wang
 
海通证券数据库备份恢复云平台实践(OTN Tour Shanghai 2017)
海通证券数据库备份恢复云平台实践(OTN Tour Shanghai 2017)海通证券数据库备份恢复云平台实践(OTN Tour Shanghai 2017)
海通证券数据库备份恢复云平台实践(OTN Tour Shanghai 2017)Zhaoyang Wang
 
Oracle Compute Cloud Service快速实践
Oracle Compute Cloud Service快速实践Oracle Compute Cloud Service快速实践
Oracle Compute Cloud Service快速实践Zhaoyang Wang
 
Oracle cloud 使用云市场快速搭建小型电商网站
Oracle cloud 使用云市场快速搭建小型电商网站Oracle cloud 使用云市场快速搭建小型电商网站
Oracle cloud 使用云市场快速搭建小型电商网站Zhaoyang Wang
 
Oracle cloud ravello介绍及测试账户申请
Oracle cloud ravello介绍及测试账户申请Oracle cloud ravello介绍及测试账户申请
Oracle cloud ravello介绍及测试账户申请Zhaoyang Wang
 
Oracle cloud 云介绍及测试账户申请
Oracle cloud 云介绍及测试账户申请Oracle cloud 云介绍及测试账户申请
Oracle cloud 云介绍及测试账户申请Zhaoyang Wang
 
Performance Tuning Tool01-Statspack
Performance Tuning Tool01-StatspackPerformance Tuning Tool01-Statspack
Performance Tuning Tool01-StatspackZhaoyang Wang
 
Oracle enterprise manager cloud control 12c r5 agent installation
Oracle enterprise manager cloud control 12c r5 agent installationOracle enterprise manager cloud control 12c r5 agent installation
Oracle enterprise manager cloud control 12c r5 agent installationZhaoyang Wang
 
Oracle security 08-oracle network security
Oracle security 08-oracle network securityOracle security 08-oracle network security
Oracle security 08-oracle network securityZhaoyang Wang
 
Oracle security 02-administering user security
Oracle security 02-administering user securityOracle security 02-administering user security
Oracle security 02-administering user securityZhaoyang Wang
 
Interpreting execution plans
Interpreting execution plansInterpreting execution plans
Interpreting execution plansZhaoyang Wang
 
Installation and configuration 11g r2 asm using job role separation(grid & or...
Installation and configuration 11g r2 asm using job role separation(grid & or...Installation and configuration 11g r2 asm using job role separation(grid & or...
Installation and configuration 11g r2 asm using job role separation(grid & or...Zhaoyang Wang
 

More from Zhaoyang Wang (13)

海通证券金融云思考与实践(数据技术嘉年华2017)
海通证券金融云思考与实践(数据技术嘉年华2017)海通证券金融云思考与实践(数据技术嘉年华2017)
海通证券金融云思考与实践(数据技术嘉年华2017)
 
云管理平台助力海通金融云建设
云管理平台助力海通金融云建设云管理平台助力海通金融云建设
云管理平台助力海通金融云建设
 
海通证券数据库备份恢复云平台实践(OTN Tour Shanghai 2017)
海通证券数据库备份恢复云平台实践(OTN Tour Shanghai 2017)海通证券数据库备份恢复云平台实践(OTN Tour Shanghai 2017)
海通证券数据库备份恢复云平台实践(OTN Tour Shanghai 2017)
 
Oracle Compute Cloud Service快速实践
Oracle Compute Cloud Service快速实践Oracle Compute Cloud Service快速实践
Oracle Compute Cloud Service快速实践
 
Oracle cloud 使用云市场快速搭建小型电商网站
Oracle cloud 使用云市场快速搭建小型电商网站Oracle cloud 使用云市场快速搭建小型电商网站
Oracle cloud 使用云市场快速搭建小型电商网站
 
Oracle cloud ravello介绍及测试账户申请
Oracle cloud ravello介绍及测试账户申请Oracle cloud ravello介绍及测试账户申请
Oracle cloud ravello介绍及测试账户申请
 
Oracle cloud 云介绍及测试账户申请
Oracle cloud 云介绍及测试账户申请Oracle cloud 云介绍及测试账户申请
Oracle cloud 云介绍及测试账户申请
 
Performance Tuning Tool01-Statspack
Performance Tuning Tool01-StatspackPerformance Tuning Tool01-Statspack
Performance Tuning Tool01-Statspack
 
Oracle enterprise manager cloud control 12c r5 agent installation
Oracle enterprise manager cloud control 12c r5 agent installationOracle enterprise manager cloud control 12c r5 agent installation
Oracle enterprise manager cloud control 12c r5 agent installation
 
Oracle security 08-oracle network security
Oracle security 08-oracle network securityOracle security 08-oracle network security
Oracle security 08-oracle network security
 
Oracle security 02-administering user security
Oracle security 02-administering user securityOracle security 02-administering user security
Oracle security 02-administering user security
 
Interpreting execution plans
Interpreting execution plansInterpreting execution plans
Interpreting execution plans
 
Installation and configuration 11g r2 asm using job role separation(grid & or...
Installation and configuration 11g r2 asm using job role separation(grid & or...Installation and configuration 11g r2 asm using job role separation(grid & or...
Installation and configuration 11g r2 asm using job role separation(grid & or...
 

Optimizer operators

  • 1. Optimizer operators 1.行源操作 1.Unary Operations:一元运算,即单表的查询; 2.Binary Operations:二元运算,两表的连接; 3.N-ary Operations:多元运算; 2.主要的结构和访问路径: 1.表: 1.Full Table Scan; 2.Rowid Scan:很少使用,多用在内部的某一个步骤; 3.Sample Table Scan:很少使用; 2.索引: 1.Index Scan(Unique); 2.Index Scan(Range); 3.Index Scan(Full); 4.Index Scan(Fast Full); 5.Index Scan(Skip); 6.Index Scan(Index Join); 7.Using Bitmap Indexes; 8.Combining Bitmap Indexes; 3.索引的基本概念: 1.B-Tree Indexes:平衡树索引,最常见的索引; 1.正常索 引;
  • 3. 3.IOT(Index-Organized Table):将表结构整体 放入索引中,而且按照主键进行排序,一定要有主键, 非主键的列一定要落在索引条目里; 4.Bitmap Indexes; 1.可以索引空值; 2.适当发生转换:TO ROWIDS/FROM ROWIDS/COUNT; 3.可以进行的操 作:MERGE/AND/OR/MINUS/KEY ITERATION,位运算的速度很快; 4.位图索引可以进行 SINGLE VALUE/ RANGE SCAN/ FULL SCAN 扫描; 5.缺点是位图索引不能经常更新,效率很差; 5.Cluster Indexes; 1.如果要做两个表的关联查询则最少查询两个 块; 2.CLUSTER 把两个表按照关联的字段把记录存 放在同一个块上;这样只用查一个块即可;查 找时效率提高一倍;
  • 4. 3.用在总是关联查询两个表的情况,一般是不用 的;ORACLE 内部大量使用; 4.cluster 上的索引不能指定列,必须使用所有 的列; 5.基于 cluster 的表没有 segment; 2.索引的属性: 1.键压缩; 2.反转键值(考点):可以防止索引块争用(buffer busy wait),只支持等式连接,不支持范围扫描; 3.顺序/倒序; 3.索引和 NULL 值: 1.NULL 值与索引的关系: 1.基于单列的唯一索引,可以多次插入 NULL 值 (NULL <> NULL),因为索引并不存储 NULL 值; 2.基于多列的符合索引,尽管全为 NULL 的值可 以多次插入([NULL, NULL] <> [NULL, NULL]),索引也不会存储,但不全为 NULL 的 重复行则不能重复插入,; 2.NULL 值与执行计划:
  • 5. 1.如果列的属性允许为 NULL,条件为 IS NULL 的话,肯定走全表扫描,因为索引不保存 NULL 值; 2.如果列的属性允许为 NULL,条件为 IS NOT NULL 的话,会走全索引扫描; 3.如果列的属性为 NOT NULL,条件为 IS [NOT] NULL 的话,走索引扫描; 4.组合索引的话,如果条件中只出现一列的话跟 单列索引一样; 5.组合索引的话,如果条件中出现两列,会优先 选择走索引; 3.IS NULL 使用索引的办法: 1.在 NULL 的列上创建函数索 引:nvl(column_name, -1),查询的时候条 件指定函数索引: where nvl(column_name, -1) = -1; 2.为 NULL 的列添加默认值; 4.索引的管理: 1.插入数据后再创建索引,对于 DW 来言; 2.在适当的表和列上加索引; 3.注意组合索引的顺序; 4.控制索引的数量:每添加一个索引,DML 的效率下降 3 倍,官方推荐最多加 7 个索引;
  • 6. 5.删除不使用的索引; 6.为索引指定单独的表空间; 7.创建索引时使用并行,NOLOGGING 参数; 8.COALESCING 是合并相邻叶子节点,rebuild 则可 以减少索引树的高度; 5.检测索引是否被使用了: 1.添加对某个索引的监控:ALTER INDEX EMP_EMP_ID_PK MONITORING USAGE; 2.查看监视的对象使用情况:SELECT * FROM v$object_usage;默认是没有任何的监视 的; 3.使用此索引后再查 看;
  • 8. 4.各种访问路径的原理及使用场景: 1.Full Table Scan: 1.会执行 Multiblock Reads,参考初始化参 数:db_file_multiblock_read_count; 2.会读取 HWM(High-Water Mark)以下所有被格式 化的块; 3.过程中可能会过滤某些记录; 4.用在要获得大量记录的时候,比索引扫描更快; 5.使用的场景: 1.没有合适的索引; 2.过滤条件不好,甚至是没有过滤条件; 3.表太小,记录数很少; 4.需要并行扫描,并行扫描一定不走索引,如果 确定是全表的话可以考虑并行:SELECT /*+ PARALLEL(d 4) */ * FROM departments
  • 9. d; 5.加全表扫描的 hint 时:SELECT /*+ FULL (d)*/ * FROM departments d WHERE department_id = 10; 6.IS NULL 的操 作;
  • 10. 2.ROWID Scan: 1.根据记录的 rowid 查询,最快的访问方式,但不经常 使用,可能会出现在执行计划的某个步骤中; 2.使用的方 法: 3.Sample Table Sacns:基本不用,SELECT * FROM departments SAMPLE BLOCK (10) SEED (1); 4.Index Unique Scan:条件中指定了主键列或者唯一键的 列就走唯一键扫
  • 12. 高;) 3.走函数索引的例子,也是索引范围扫描的一 种; 6.Index Full Sacn vs Index Fast Full Sacn: 1.出现的条件: 1.SELECT 与 WHERE 子句出现的所有的列必须存 在索引,而且为非空列,因为索引不存放 NULL 值; 2.返回的数据总行占据索引的 10%以上的比例; 2.Index Full Sacn: 1.完全按照索引存储的顺序依次访问整个索引树, 当访问到叶子节点时,按照双向链表方式读取 相连的节点值; 2.使用 Single Read,会产生 db file sequential reads 事件;
  • 13. 3.对于索引列上的排序,总是会使用 Index Full Scan; 4.索引列上 is not null 的操作,会走全索引 扫描; 3.Index Fast Full Sacn: 1.对于索引的分支结构只是简单的获取,然后扫 描所有的叶节点,导致索引结构没有访问,获 得的数据没有根据索引键的顺序排序,读取效 率高.但是如果 SQL 语句中有排序操作的话, 还要额外多做一次排序; 2.在使用 Index Fast Full Sacn 时,使用 Multiblock Read,会产生 db file scattered reads,db_file_multiblock_read_cou nt 参数的设置很重要; 3.统计行数,如 count(*)的操作总是会使用 Index [Fast] Full Scan 的; 4.会使用大量的内存和 CPU 资源; 4.Index [Fast] Full Scan 的例 子;
  • 14. 7.Index Skip Scan: 1.创建了复合索引,但是条件中只有复合索引中的第二 列,而且当第一列的 distinct 值不多时,会发生跳 跃扫描; 2.创建一个测试表,和一个联合索引,当第一列可选值 少而条件中只查找第二列时,发生跳越扫 描; 3.如果第一列的可选值很多,条件中查找第二列的话, 发生全表扫 描;
  • 15. 8.Index Join Scan:查询的列都不为空,而且都有索引才 会出现联合扫 描; 9.AND-EQUAL 操作:两列都有索引,分别扫描两列获得记录 的 rowid,然后再取 rowid 的交集; 10. Bitmap Index: 1.Bitmap 的单值扫 描;
  • 17. 5.排序操作: 1.Sort Operator: 1.AGGREGATE:在 group 操作用会用到,统计结果; 2.UNIQUE:评估是否重复; 3.JOIN:做合并操作; 4.GROUP BY,ORDER BY:在 group by 和 order by 的时候使用; 2.Hash Operator: 1.GROUP BY:在 group by 操作时使用; 2.UNIQUE:跟 SORT UNIQUE 一样; 3.10g 之后结果默认不排序,如果想要排序后的结果,应该总 是使用 ORDER BY 字句; 6.Buffer Sort: 1.BUFFER SORT 不是一种排序,而是一种临时表的创建方 式; 2.BUFFER 表示在内存中存放了一张临时表;
  • 18. 3.SORT 来修饰 BUFFER 表示具体再内存的什么地方:在 PGA 的 SQL 工作区的排序区; 4.BUFFER SORT 的例 子: 7.INLIST ITERATOR: 1.是由于 IN 操作引起的,要关注迭代的次数,一次迭代就要 有一次访问,如果没有索引可能性能问题会很严重; 2.可以使用 UNION ALL 操作代替; 3.INLIST ITERATOR 的例 子;
  • 19. 8.视图的操作: 1.Merge View:是将 View 的定义和外部查询合并,高效的 方式; 2.No Merge View:先将 View 的数据取出来再做外部条件 的过滤,效率低; 9.执行计划中的 Count 和 Count Stopkey:oracle 数据库的优 化关于 rownum 操作; 1.在查询中有时使用到伪列 rownum,对使用伪列 rownum 的 查询,优化器要么使用 count 操作,要么使用 count stopkey 操作来对 rownum 计数器进行增量(注意:这里的 count 操作和 count stopkey 操作与 count 函数没有
  • 20. 任何关系).如果对 rownum 伪列应用一个限定条件, 如:where rownum<10,则使用 count stopkey 操作; 如果不为 Rownum 伪列指定限定条件,则是使用 count 操 作; 2.不在 Rownum 伪列上使用限定条件:SELECT employee_id, ROWNUM FROM employees;(employee_id 是主键)为了完成这个查询, 优化器执行一个全索引扫描(主键索引),后跟一个 count 操作生成每个行的 rownum 值,count 操作不需要等待得 到整个记录集,随着从 employee 表中返回记录,rownum 计数器进行增量,从而确定每个记录的 rownum; 3.在 rownum 伪列上使用一个限定:SELECT employee_id, ROWNUM FROM employees WHERE ROWNUM < 10;为 了实施限定条件,优化器用 count stopkey 操作代替 count 操作,它将 rownum 伪列的增量值与限定条件中指 定的值进行比较,如果 rownum 伪列的值大于限定条件中
  • 21. 指定的值,则查询不再返回更多的行; 4.在 where 子句中不能使用 rownum>10 这样的操作,只能 使用 rownum<10 这样的操作; 10. Min/Max and First Row 操作:当使用 MAX/MIN 函数时 发 生; 11. 连接的方式: 1.一个连接定义了两个行源的关系,也是合并两个行源间数 据的方法; 2.主要由连接的谓词所控制,定义了对象间的关 系;
  • 22. 3.连接的方法: 1.Nested Loops: 1.对于被连接的数据子集较小的情况,嵌套循环 是个较好的选择; 2.返回第一条记录最快的方式; 3.这种情况下,内表被外表驱动,外表返回的每 一行都要在内表中检索找到它匹配的行,因此 整个查询返回的结果集不能太大(eg:<1w); 4.要把返回子集较小的表作为驱动表,而且内标 的连接字段上一定要有索引; 5.使用 USE_NL(table_name1 table_name2) 可是强制 CBO 执行嵌套循环连接; 2.Sort-Merge Join: 1.通常情况下散列连接的效果都比排序合并连接 要好,然而如果行源已经被排过序,在执行排 序合并连接时不需要再排序了,这时排序合并 连接的性能会优于散列连接; 2.可以使用 USE_MERGE(table_name1 table_name2)来强制使用排序合并连接;
  • 23. 3.Sort Merge join 使用的情况: 1.用在没有索引; 2.数据已经排序的情况; 3.不等价关联; 4.HASH_JOIN_ENABLED=FALSE; 3.Hash Join: 1.散列连接是 CBO 做大数据集连接时常用的方式, 优化器使用两个表中较小的表(行源)利用连 接键在内存中建立散列表,然后扫描较大的表 并探测散列表,找出与散列表匹配的行; 2.这种方式适用于较小的表完全可以放于内存中 的情况,这样总成本就是访问两个表的成本之 和,但是在表很大的情况下并不能完全放入内 存,这时优化器会将它分割成若干不同的分区, 不能放入内存的部分就把该分区写入磁盘的临 时段,此时要有较大的临时段从而尽量提高 I/O 的性能; 3.也可以用 USE_HASH(table_name1 table_name2)提示来强制使用散列连接,如 果使用散列连接 HASH_AREA_SIZE 初始化参 数必须足够的大,如果是 10g 以后,Oracle 建 议使用 SQL 工作区自动管理,设置
  • 24. WORKAREA_SIZE_POLICY 为 AUTO,然后调 整 PGA_AGGREGATE_TARGET 即可; 4.连接方式的比较: 1.Hash join 的工作方式是将一个表(通常是小一点 的那个表)做 hash 运算,将列数据存储到 hash 列表 中,从另一个表中抽取记录,做 hash 运算,到 hash 列表中找到相应的值,做匹配; 2.Nested loops 工作方式是从一张表中读取数据,访 问另一张表(通常是索引)来做匹配,nested loops 适用的场合是当一个关联表比较小的时候,效率会更 高; 3.Merge Join 是先将关联表的关联列各自做排序, 然后从各自的排序表中抽取数据,到另一个排序表中 做匹配,因为 merge join 需要做更多的排序,所以 消耗的资源更多,通常来讲,能够使用 merge join 的地方,hash join 都可以发挥更好的性能,Merge Join 太消耗 PGA; 5.连接的类型: 1.[不]等值连接和自然连接; 2.外连接:全连接,左外连接,右外连接;(外连接:+号 放那边,哪边记录少;) 3.半连接:EXISTS 子句;
  • 25. 4.反连接:NOT IN 字句; 12. 多行源的操作 1.FILTER; 2.CONCATENATION; 3.UNION [ALL] 4.INTERSECT; 5.MINUS; -- Full Table Scan; SELECT * FROM departments WHERE manager_id = 100; SELECT /*+ PARALLEL(d 4) */ * FROM departments d; SELECT * FROM departments d WHERE department_id = 10; SELECT /*+ FULL (d)*/ * FROM departments d WHERE department_id = 10; -- ROWID Sacn; SELECT * FROM departments WHERE ROWID = 'AAAMiZAAFAAAAA4AAI'; SELECT * FROM departments WHERE ROWID = ( SELECT rowid FROM departments WHERE manager_id = 100); -- 函数索引的例子; CREATE INDEX idx_employees_fun_firstname ON employees (upper(first_name)); SELECT * FROM user_tab_cols WHERE table_name = 'EMPLOYEES'; SELECT * FROM user_ind_expressions WHERE index_name = 'IDX_EMPLOYEES_FUN_FIRSTNAME'; -- Index Skip Scan 的例子; CREATE TABLE skip_test AS SELECT object_id, object_name, decode(object_type, 'VIEW', 'VIEW', 'TABLE') AS object_flag, object_type FROM dba_objects WHERE ROWNUM <= 3000; CREATE INDEX idx_skip_test ON skip_test(object_flag, object_id); EXEC dbms_stats.gather_table_stats(USER, 'skip_test', CASCADE => TRUE);
  • 26. SELECT * FROM skip_test WHERE object_id = 100; -- 如果联合索引第一列的候选值太多,则发生全表扫描; DROP INDEX idx_skip_test; CREATE INDEX idx_skip_test ON skip_test(object_type, object_id); EXEC dbms_stats.gather_table_stats(USER, 'skip_test', CASCADE => TRUE); SELECT * FROM skip_test WHERE object_id=100; -- 位图索引的例子; CREATE TABLE bitmap_test AS SELECT ROWNUM rn, MOD(ROWNUM, 4) bit, CASE MOD(ROWNUM, 2) WHEN 0 THEN 'M' ELSE 'F' END gender FROM dual CONNECT BY ROWNUM < 1000; CREATE BITMAP INDEX bmp_bitmap_bit on bitmap_test (bit); CREATE BITMAP INDEX bmp_bitmap_gender on bitmap_test (gender); EXEC dbms_stats.gather_table_stats(USER, 'bitmap_test', CASCADE => TRUE); ALTER SESSION optimizer_mode = 'FIRST_ROWS_1000'; SELECT * FROM bitmap_test WHERE bit = 3; SELECT * FROM bitmap_test WHERE bit > 2; SELECT * FROM bitmap_test WHERE bit IN (2, 3); SELECT * FROM bitmap_test WHERE bit IN (2, 3) AND gender = 'M';