《跨 界 之SQL、PL/SQL优化指南》目录上

优化新作,《跨 界 之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

时间: 2024-10-24 16:11:43

《跨 界 之SQL、PL/SQL优化指南》目录上的相关文章

2.PL/SQL——PL/SQL概述及其基本结构

一.什么是PL/SQL PL/SQL是对SQL语言的扩展. SQL语言是一种非过程性语言,即用户只需要告诉计算机做什么,而不需要理解计算机是怎么做的.比如用户要查询一张表里的某一列数据,只需要输入:selectCOLUNM_NAME from TABLE_NAME where CONDITION:就可以了,而不需要了解计算机是如何查询的.这既是优点也是缺点,优点就是该语言非常容易学习,缺点则是缺乏过程控制,限制了其功能,比如无法进行if...else的条件判断,也无法进行for循环操作. 基于S

sql: PL/SQL proc

A PL/SQL block has the following structure: [DECLARE declaration_statements ] BEGIN executable_statements [EXCEPTION exception_handling_statements ] END; / []中是可选的.

SQL & PL/SQL 模块总结

SQL 1. 各种function 2. merge 3. connect by PL/SQL 1. pl/sql 寄出 2. 游标 3. procedure 4. function 5. package 6. trigger 基本上是到实际使用时再确认就好了.

Hotspot优化指南(上)

一次偶然,博主在浏览docs.oracle.com/javase的时候发现了<Hotspot虚拟机垃圾收集调优指南>这篇文档.内心百感交集,之前在看完了周志明的<深入理解Java虚拟机 JVM高级特性与最佳实践(第二版)>也有比较长篇的学习记录博客发表.不过那也是基于JDK7进行编写的.后续的8.9.10都没有找到好的关于JVM更加新的好的内容.由于性子懒惰加上本身英语不佳,一直都没上官网进行相关研究.本篇文章就是博主在研读这篇文档的时候所记录,也是基于现如今最流行的JDK8相关内

pl/sql编程

body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;

ORACLE PL/SQL编程详解

ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问.由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理.除此之外,可以在ORACLE数据库的某些客户端工具中,使用PL/SQL语言也是该语言的一个特点.本章的主要内容是讨论引入PL/SQL语言的必要性和该语言的

ORACLE数据库笔记之PL/SQL

PL/SQL PL/SQL是一种块结构的语言,它是将一组语句放在一个块中,一次性发送给服务器.它是结合Oracle过程语言和结构化查询语言的一种扩展语言 PL/SQL代码块的构成 declare --标记声明部分用来声明一些变量,位于begin之前 begin  --主程序体开始的标志 主程序体块: [exception when 异常名 then 异常处理的方法; when 异常名  then 异常处理的方法; ... when other then 异常处理的方法;] end;  --主程序

[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下) ——通过知识共享树立个人品牌. 继上六篇: [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程之四:把游标说透(

(十七)PL/SQL DBMS输出

DBMS_OUTPUT是一个内置的软件包,能够显示输出显示调试信息,并从PL/ SQL块,子程序,包和触发器发送消息. 让我们来看看一个小的代码片段,将显示在数据库中的所有用户表. //尝试在数据库列出了所有的表名: BEGIN    dbms_output.put_line  (user || ' Tables in the database:');    FOR  t  IN (SELECT table_name FROM user_tables)    LOOP       dbms_ou

PL/SQL : Procedural Language / Structual Query Language and it is an exrension to SQL.

SQL is not very flexible and it cannot be made to react differently to differing sutuations easily. In  SQL queries we normally tell database what we want but not tell it how to do it. SQL : give commands, commands complete with ; PL/SQL : follow the