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 的例
子;
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 的例
子;
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';