优化新作,《跨 界 之SQL、PL/SQL优化指南》详细目录。
目 录
一.理论篇....................................................................10
1.1). SQL的处理过程.......................................................10
1.2). 连接方式(JOIN METHODS)..............................................10
1.2.1). 嵌套循环连接(Nested Loops Joins)..............................11
1.2.2). 哈希连接(Hash Joins)........................................12
1.2.3). 排序合并连接(Sort Merge Joins)..............................15
1.2.4). 笛卡尔积连接(Cartesian Joins)...............................17
1.3). 表的访问路经(table Access Paths)..................................18
1.3.1). 直接路径读(Direct Path Reads).................................18
1.3.2). 全表扫描(Full Table Scans)....................................19
1.3.3). 通过 ROWID 访问表(Table Scans By ROWID).......................19
1.3.4). 示例表扫描(Sample Table Scans)................................20
1.3.5). B-TREE索引路径访问(B-tree Index Paths) .......................25
1.3.6). 位图索引路径访问(Bitmap Index Access Paths).................29
1.3.7). 簇表访问路径(Table Cluster Access Paths).....................30
1.3.8). HASH扫描(Hash Scans).........................................31
1.4).分区表和分区索引.....................................................31
1.4.1).分区表类型....................................................31
1.4.1.1). Range分区.............................................31
1.4.1.2). List分区..............................................32
1.4.1.3). Hash分区..............................................35
1.4.1.4). 组合分区..............................................36
1.4.1.4.1). Range-hash组合分区...........................37
1.4.1.4.2). Range-list分区...............................38
1.4.1.4.3). Range-range分区..............................39
1.4.1.4.4). List-hash分区................................39
1.4.1.4.5). List-list分区................................40
1.4.1.4.6). List-range分区...............................40
1.4.1.5). 引用分区..............................................41
1.4.1.6). 内存列分区(仅限于12C).................................41
1.4.1.7). 间隔分区..............................................42
1.4.1.8). 系统分区..............................................42
1.4.1.9). 虚拟列分区............................................43
1.4.1.10). 分区表使用压缩特征...................................43
1.4.2). 分区索引.....................................................44
1.4.2.1). 全局分区索引..........................................44
1.4.2.2). 本地分区索引..........................................46
1.4.3). 分区索引的使用原则...........................................47
1.5). 索引..................................................................47
1.5.1). B-TREE索引.....................................................47
1.5.1.1). 反键索引(Reserve Key Indexes)............................48
1.5.1.2). 降序索引(Descending Indexes).............................49
1.5.1.3). B-TREE簇索引(B-tree Cluster Indexes).....................50
1.5.1.4). 索引组织表(Index-organized Tables).......................51
1.5.2). 位图和位图连接索引(Bitmap and Bitmap Join Indexes)..............52
1.5.3). 基于函数的索引(Functions-based Indexes).........................53
1.5.4). 域索引(Application Domain Indexes)..............................54
1.5.4.1). 上下文索引(Context Indexes)..............................54
1.5.4.2). CTXCAT索引...............................................56
1.5.4.3). 基于规则的索引(Rule Based Indexes).......................58
1.5.5). 建立索引的注意事项..............................................59
1.5.6). 使用索引的注意事项..............................................59
1.5.7). 全表扫描有时为什么比索引扫描高效.................................60
二. 设计篇..................................................................61
2.1). 表的设计............................................................61
2.1.1). 什么时候使用堆表(Head-organized Tables).......................61
2.1.2). 什么时候使用素引组织表(Index-organized Tables).................61
2.1.3). 什么时候使用只读表(Read Only Tables)..........................62
2.1.4). 什么时候使用临时表(Temporary Tables)..........................62
2.1.5). 什么时候使用簇表(Cluster Tables)..............................63
2.1.6). 什么时候使用压缩表(Compressed Tables).........................64
2.1.7). 什么时候使用分区表(Partition Tables)..........................64
2.1.8). 什么时候使用外部表(External Tables)...........................65
2.1.9). 什么时候使用虚拟列(Virtual Columns)...........................66
2.1.10). 什么时候使用不可见列(Invisible Columns)......................67
2.1.11). VARCHAR2和 NUMBER字段类型的选择..............................67
2.1.12). NUMBER 和PLS_INTRGER类型的选择...............................68
2.1.13). NUMBER 和SIMPLE_DOUBLE, SIMPLE_FLOAT类型的选择...............68
2.1.14). NUMBER和NUMERIC 类型的选择...................................69
2.1.15). LONG、CLOB、BLOB等大字段尽量少用,如要使用用文件系统储存.......69
2.1.16). 建表时PCTFREE和 PCTUSED 参数的选择............................69
2.1.17). 建表时常用字段尽量放在前面....................................70
2.1.18). 归档表,历史表和只读表可以使用压缩功能.........................70
2.1.19). 大表要考虑数据的保留期限,转移和清理机制,数据不要老放在一个表里
71
2.1.20). 对象命名时要做到知名见议,符合项目规范.........................71
2.1.21). 表名,字段名要加注释..........................................71
2.1.22). 大表上严禁建触发器............................................72
2.1.23). 日志大表不要加任何约束条件.....................................72
2.1.24). 不要使用ORACLE自带的表空间,更不能使用SYSTEM, SYSAUX表空间,按要
求自建表空间存放用户数据.......................................72
2.2). 索引的设计..........................................................72
2.2.1). 表的关联条件上应该建立索引......................................72
2.2.2). 能过滤大量数据的字段上应该建立索引..............................73
2.2.3). 索引应该建在高可用字段上面,列的非重复值 / 总行数 越接近于1,表示可
用性越高......................................................73
2.2.4). 一些快态、类型字段上少建B-TREE索引.............................74
2.2.5). 建组合索引时,要把最常用的字段放在前面..........................74
2.2.6). 能用单索引实现的,就少使用组合索引.............................75
2.2.7). 索引不要包含"包含与被包含"关系.................................75
2.2.8). 经常进行写操作的表应少建索引...................................76
2.2.9). NULL值使用索引的问题..........................................77
2.2.10). LIKE 使用索引的问题..........................................78
2.2.11). 一个有意思的索引案例.........................................79
2.2.12). 建索引时,索引的表空间要和数据的表空间分离....................80
2.2.13). VARCHAR2类型定义长度大小对索引的影响.........................80
2.2.14). 外健不加索引会引发死锁和表连接性能的问题......................80
2.2.15). 索引的命名问题..............................................83
2.3). 其它对象的设计....................................................84
2.3.1). 序列的设计...................................................84
2.3.2). 尽量少用VIEW.................................................84
2.3.3). 相似语句需要使用绑定变量......................................86
2.3.4). PL/SQL中能用静态SQL实现的逻辑,尽量不要使用动态SQL。如果使用动态
SQL尽可能的使用绑定变量.......................................86
2.3.5). 使用F0RALL代替FOR ...LOOP循环.................................87
2.3.6). PL/SQL中应直接赋值,不要使用Select XXX into 变量 from dual的方式
88
2.3.7). PL/SQL中DML和DDL语句不能混放在一起,否则会产生意想不到的结果....88
2.3.8). 子程序中参数的定义,尽量使用%TYPE 来绑定,所有变量尽量加上注释...89
2.3.9). 当函数被反复调用,且参数不常改变时,可以启用 RESULT_CACHE 功能...89
2.3.10). 注意短路评估的问题(Short -Circult Evaluation)...................90
2.3.11). 使用SELECT BULK COLLECT INTO代替SELECT INTO 返回多行结果集...91
2.3.12). 由于SELECT BULK COLLECT INTO语句返回大量行会产生巨大的集合,应该
限制返回的行数...............................................92
2.3.13). FETCH BULK COLLECT语句使用LIMIT限制返回的行数和集合大小.......93
2.3.14). RETURNING INTO子句使用BULK COLLECT...........................94
2.3.15). 使用管道表函数(PIPED TABLE FUNCTIONS)......................95
2.3.16). 异常处理(EXCEPTION)........................................95
2.3.17). 如果子程序返回游标类型参数,必须在任何出口前打开游标,用完后须关闭
97
2.3.18). 书写格式按照右对齐的原则进行编写...............................98
2.3.19). 注释部分......................................................98
2.3.20). 处理业务逻辑时,先锁住A表再锁B表,所有的处理都要按照这个顺序,否
则可能产生死锁...............................................100