##  注意事项

1. 脚本中有关创建数据库表的语句是为了方便自己测试和脚本的重复执行性才先删除再重新创建，在实际的开发当中不能这样干。
2. 在配置环境创建用户`eoda`时的那个脚本是不可以重复执行的，脚本还需要完善。

# 目录
## 配置环境
用于创建一些后面会用到的用户或者表等信息

## 第一章 开发成功的`oracle`应用

## 第二章 体系结构简介

## 第三章 文件

## 第四章 内存结构

## 第五章 `oracle`进程

## 第六章 锁

## 第七章 并发与多版本控制

## 第八章 事务
### 原子性
#### 语句级原子性
即使存在触发器，一条语句要么成功，要么失败。

#### 过程级原子性
调用存储过程的时候，存储过程中存在语句级原子性，会保存存储过程的部分工作

#### 事务级原子性
事务的总目标是把数据库从一种一致状态转到另一种一致状态，事务是一个原子性单元

### 一致性

### 隔离性

### 持久性


## 第九章 `redo`与`undo`


## 第十章 数据库表
* 表类型
  * 堆组织表:存储的数据一般都是无序的。
  * 索引组织表:存储在索引结构中的表，iot的数据是按照主键顺序来排序的，索引表组织不存在主键索引的空间开销(索引就是数据，数据就是索引)，但是管理和维护索引需要浪费资源。iot好处:
	* 提高缓冲区缓存效率，尾音给定查询在缓存中的块更少
	* 减少缓冲区缓存访问，这会改善可扩展性。
	* 获取数据的总工作量，因为获取数据更快。
	* 每次查询完成物理IO更少
  * 索引聚促表:利用聚簇，一个块可能包含多个表 的数据。概念上就是如果两个或多个表经常做链接操作，那么可以把需要的数据预先存储在一起。聚簇还可以用于单个表，可以按某个列将数据分组存储。
	不能使用聚促的情况:
	* 聚簇中的表会大量修改
	* 如果需要对聚簇中的表执行全表扫描
    * 如果你认为需要频繁地TRUNCATE和加载表：聚簇中的表不能截除。
  * 散列聚促表
  * 有序散列聚促表
  * 嵌套表
*  术语
  * 段:占用磁盘上存储空间的一个对象，包括:聚簇、表、表分区、索引、索引分区等。
  * 段空间管理:
	* 手动段空间管理:
      * `FREELIST`:oracle会使用freelist维护高水位线之下的块,当freelist为空时才会使用高水位之上的块，多并发用户在一个对象上执行大量插入或者跟新操作时，就可以使用配置多个freelist来提升性能。
	* 自动段空间管理:
  * 高水位线:曾经包含过的最右边的块,oracle在全面扫描段时，会扫描高水位线以下的所有块。即使是高水位线与低水位线之间不包含任何数据的块也会被扫描。
	* 手动段空间管理：当高水位线推动时会格式化所有高水位线之下的块
	* 自动段空间管理:当高水位线推动时不会格式化所有高水位线之下的块，而是当使用的时候才格式化。
  * 低水位线:oracle认为低水位线之下的数据都是安全的，可以直接读取
  * `PCTFREE`和`PCTUSED`:
  * `LOGGING`和`NOLOGGING`
  * `INITRANS`和`MAXTRANS`

## 第十一章 索引
### B*Tree索引
#### 索引键压缩
多列索引(索引的定义含有多列)中去除冗余数据
#### 反向键索引
能够将索引键反转，目的主要是减少右手索引中索引也快竞争。某些用一个序列或者时间戳填充，这些列上建立的索引就属于右手索引.
#### 降序索引
列中的数据是以降序(由达到小)的方式存储的，而不是升序(由小到大)。
#### 使用B*Tree情况
* 需要访问表中非常少的一部分数据，就用B*Tree索引
* 需要处理表中大量的数据，但这些数据都可以通过索引直接拿到

### 位图索引
* 适用场景:适用于相异系数低的数据，也就是与整个数据集的总数相比，这个数据只有很少的几个不同的值。
#### 位图联结索引
一般索引都是建立一张表上，位图联结索引可以建立在两张表上。

### 基于函数的索引
对于某些列经过计算之后的结果进行索引，比如对一个大小不敏感的字段进行搜索，可以使用函数索引，对字段值的大写的值进行索引，方便查询时走索引

### 关于索引上的一些问题总结
#### 视图上是否能建立索引
访问视图 时，oracle会把视图转换成视图所定义的查询。因此只需要在视图对应的基表上面建立索引即可
#### Null能和索引协作吗
B*Tree不会存储键值完全为空值的条目，而位图索引和聚促索引会存储。所以B*Tree索引在查询为空的值时候不会走索引
#### 外键是否应该加索引
外键是导致死锁的原因之一
#### 传言：索引中从来不重用空间
* 一旦插入了可以重用空间的数据，索引上的空间立刻会被重用
* 只有索引块完全被清空时，数据库才会把它从索引中取出来以备使用。

#### 传言：最有差别的元素应该放在最前面

#### 索引没有用到情况
##### 存在B*Tree索引，但是没有使用索引的最前列
比如，表t的索引是(x,y)，当x的取值可能比较多，使用下面语句用不到索引,但是如果x的值比较少CBO中可以使用跳跃式扫描
```sql
select * from t where y = 's';
```
##### 使用类似于下面语句
```sql
select count(*) from t;
```
因为B*Tree索引不会保存为null的数据，所以会导致索引行数和表中实际行数不一致，优化器会选择使用全表扫描
##### 在加了索引的列上使用函数
```sql
select * from t where upper(x) = 'A';
```
如果经常使用这种函数，可以考虑加函数索引
##### 在字符类型的索引上，存放了一些数值类型
```sql
select * from t where c = 5;-- 相当于下面语句
select * from t where to_number(c) = 5;
```
##### 表上的统计信息不是最新的


### 第十二章 数据类型

### 第十三章 分区

### 第十四章 并行执行

### 第十五章 数据库加载与卸载
