1 与表相关的以下术语
1.1 段
段是oracle中占用存储空间的数据库对象。创建表时会创建一个段,创建索引也会创建一个段。需要注意的是,创建表时可能会创建多个段。例如创建一个表CREATE TEST(ID PRIMARY KEY)。TEST这个表会创建两个段,一个是TEST表本身,一个是为主键所创建的索引。
1.2 段空间管理
- 手动段空间管理(Manual Segment Space Management, MSSM )。由我们设置 FREELISTS、FREELIST GROUPS、PCTFREE 、PCTUSED和其他参数来控制如何分配、使用和重用段中的空间。
- 自动段空间管理(Automatic Segment Space Management, ASSM ):只需由我们设置一个参数:PCTFREE。
1.3 高水位线(High-Water Mark, HWM )
高水位线是指段曾经包含数据最右边的块。当进行全段扫描时,oracle会扫描段中高水位线以下所有的块。所以高水位线会影响全面扫描的性能。如下图所示,当表创建时,高水位线位于表中的第一个块。随着表中数据的增加,高水位线会不断升高。删除数据后,高水位线不会降低。后面插入数据时,数据会插入这些高水位线以下之前删除过数据有空余空间的块。要降低高水位线,只能通过重建、截除(truncate)或收缩这个对象。
1.4 PCTFREE
PCTFREE是为一个块更新保留的空间百分比。默认是10%。当一个块的空闲空间低于10%,则这个块就不允许再插入数据,只能更新数据。
1.5 行迁移
行迁移是指当一行更新变得更大,无法放在原来的块中。oracle就会将这一行数据迁移到新的块,同时在原来的块中保留一个转发地址。一个表中如果发生行迁移过多,会影响性能。因为要找到发生行迁移的行,要先找到原来的块,再根据原来的块中的转发地址找到新的块,多了一步IO操作。同时,在高速缓存中也需要同时缓存两个块。
统计一个表上的行迁移情况
ANALYZE TABLE TEST COMPUTE STATISTICS;
SELECT chain_cnt,
round(chain_cnt/num_rows*100,2) pct_chained,
avg_row_len, pct_free , pct_used
FROM user_tables
WHERE table_name = 'TEST';
1.6 LOGGING 和 NOLOGGING
正常情况下,我们在数据库的操作都是LOGGING模式,LOGGING模式就是会让我们的操作都会产生redo。而NOLOGGING模式则让我们的一些操作少产生redo甚至不产生redo。
NOLOGGING 只会影响几个特定的操作,如对象的初始创建,或使用SQLLoader的直接路径加载,或者重建操作;后续正常的DML的不受NOLOGGING影响。如果要在insert select 语句(insert/+ append*/ into t nologging)使用append直接路径加载数据,插入数据的表要去掉索引才能达到更好的性能,因为索引无法直接输入磁盘,会产生很多redo。
常见dml、ddl语句使用nologging选项所生成的redo和undo大小比较:http://blog.itpub.net/53956/viewspace-1273203/
2 oracle常见的表类型
- 堆组织表(heap organized table):这就是普通的标准数据库表:数据在其中以堆的方式管理。增加数据时,会找到并使用段中第一个能放下此数据的自由空间。从表中删除数据时,则允许以后的INSERT和UPDATE重用这部分空间,这就是这种表类型中“堆”这个名字的由来。 “堆”是指一组空间,被以某种随机的方式来使用。
- 临时表(temporary table):临时表中保存的数据,只对当前会话可见。
- 外部表(external table):这些表中的数据并不存储在数据库中,而是放在数据库之外,也就是说它们被存放为普通的操作系统文件。
- 索引组织表(index organized table ):这些表按索引结构存储。这就强制要求行本身有某种物理顺序。在堆表中,只要空间放得下,数据可以放在其中任何位置;而索引组织表(IOT)则不同,数据要根据主键有序地存储在索引组织表中。