层次
DATABASE – TABLESPACE –SEGMENT-EXTENT-BLOCK
数据文件头:检查点号,metadata(属于哪个表空间等)
区至少有2个连续的块(第一个块为segment header 存放metadata HWM extent map freelist,不存放数据)
插入块的时候,从下往上写,先寻找freelist定位 (随机)
blockheader 的数据时由上往下增长
区的分配
避免动态分配区:
? 创建本地化管理的表空间.
? 合理的设置段的大小.
? 监视段.
避免动态分配区
SQL> SELECT owner, table_name, blocks, empty_blocks
2 FROM dba_tables
3 WHERE empty_blocks / (blocks+empty_blocks) < .1;
避免动态分配
SQL> ALTER TABLE hr.employees ALLOCATE EXTENT;
Table altered.
高水位线:
? 在段头块记录高水位线信息
? 在段创建的时候设置
? 使用TRUNCATE 可以重置高水位线
? DELETE语句不会重置高水位线
收回空闲空间
降低高水位线:
? 使用导出和导入工具:
? 导出表Export the table
? Drop 或者truncate 表
? 导入表
或者使用Alter Table Employees Move命令迁移表,释放空
闲空间,需要双倍的空间。
对于Oracle 10g可以采用alter table shrink space;
? 使用Alter Table Employees Deallocate Unused; 命令会
释放高水位线以上的空间.
可以参考http://www.eygle.com/archives/2011/11/oracle_hwm_tuning.html
DB_BLOCK_SIZE参数
数据块大小:
? 使用DB_BLOCK_SIZE 参数设置数据块大小
? 当创建数据库时设置
? Oracle最小的I/O单位
? 默认是2 KB 或者4 KB, 最大可以设置64 KB
? 改变数据块大小很困难
? 是操作系统块大小整数倍
? 小于或者等于操作系统I/O尺寸
设置小数据块的优点和缺点
优点:
? 减少数据块冲突
? 适合小记录
? 适合随机访问记录
缺点:
? 产生一些额外的开销
? 每个数据块只能存放很少的记录
? 可能会访问更多的索引块
PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数据块的可用空间低于10%后,就不可以被insert了,只能被用于update;即:当使用一个block时,在达到pctfree之前,该block是一直可以被插入的,这个时候处在上升期。
PCTUSED:是指当块里的数据低于多少百分比时,又可以重新被insert,一般默认是40,即40%,即:当数据低于40%时,又可以写入新的数据,这个时候处在下降期
当你删除一个数据后,再想插入个新数据行不行?不行,必须是删除41个,即低于40个以后才能插入新的数据的,这是受pctused来控制的。
注意:如果表空间上启用了ASSM,在建立表的时候,只能指定PCTFREE,否则可用指定PCTFREE和PCTUSED。
1、通过user_tables的pct_free,pct_used来查看
select a.table_name, a.pct_free, a.pct_used, a.* from user_tables a;
说明:
pctfree表示用于保留更新操作的百分比,如果超过该值不能插入数据。
pctused表示数据所占最低百分比,如果达到pctfree时不能插入,delete后如果达到pctused才可以用来insert
2、如果你使用的是自动管理表空间pctused不需要设置
altertable tablename pctfree values;
说明:
pctfree默认是10,主要看更新的数据有多大,可以查看表的max_row_len如果很大又频繁更新可以考虑增加该值。
pctused主要看删除数据的大小,如果很大可以调大该值,如果不是很频繁可以设置小一些30-40
pctused+pctfree<90
3、查看自动管理表空间
select tablespace_name,segment_space_management from user_tablespaces; --segment_space_management为auto表示自动管理表空间
主要起到节省表空间的作用
大数据块的优点和缺点
优点:
? 很少的开销
? 适合读取连续的数据
? 适合存放大记录
? 使用索引能获的很好的性能
缺点:
? 数据块冲突增加
? 占用更多的数据库缓冲区
PCTFREE 和PCTUSED设置准则
PCTFREE
? 默认是10
? 如果没有UPDATE 则设置成0
? PCTFREE = 100 × UPD / (Average row length)
upd=update
5月1日 40字节
5月30 50字节
(50-40)/50=20
PCTUSED
? 默认是40
? 如果有行删除时设置
? PCTUSED = 100 – PCTFREE – 100 × Rows × (Average row
length) / Block size
100-20-100*10*50/8192
检测行迁移和行链接r
如果ts segment为自动管理,就使用位图不是freelist,并存放在多个快中,为了并行insert
pctused:如果是自动管理,就不用
pctfree:一致都用
表分析:analyze table test estimate statistics;
检检测测行行迁迁移移和和行行链链接接::
Statistic Total Per transaction ...
------------------------- ----- --------------- ...
table fetch continued row 495 .02 …
Statistic Total Per transaction ...
------------------------- ----- --------------- ...
table fetch continued row 495 .02 …
从从SSTTAATTSSPPAACCKK中中获获取取行行迁迁移移和和行行链链接接信信息息::
SQL> ANALYZE TABLE sales.order_hist COMPUTE STATISTICS;
Table analyzed.
SQL> ANALYZE TABLE sales.order_hist COMPUTE STATISTICS;
Table analyzed.
SQL> SELECT num_rows, chain_cnt FROM dba_tables
2 WHERE table_name=‘ORDER_HIST’;
NUM_ROWS CHAIN_CNT
--------- ---------
168 102
SQL> SELECT num_rows, chain_cnt FROM dba_tables
2 WHERE table_name=‘ORDER_HIST’;
NUM_ROWS CHAIN_CNT
--------- ---------
168 102
查询出行迁移记录
SQL> ANALYZE TABLE sales.order_hist LIST CHAINED ROWS;
Table analyzed.
SQL> SELECT owner_name, table_name, head_rowid
2 FROM chained_rows
3 WHERE table_name = 'ORDER_HIST';
OWNER_NAME TABLE_NAME HEAD_ROWID
---------- ---------- ------------------
SALES ORDER_HIST AAAAluAAHAAAAA1AAA
SALES ORDER_HIST AAAAluAAHAAAAA1AAB
...
SQL> ANALYZE TABLE sales.order_hist LIST CHAINED ROWS;
Table analyzed.
SQL> SELECT owner_name, table_name, head_rowid
2 FROM chained_rows
3 WHERE table_name = 'ORDER_HIST';
OWNER_NAME TABLE_NAME HEAD_ROWID
---------- ---------- ------------------
SALES ORDER_HIST AAAAluAAHAAAAA1AAA
消除行迁移
? Export / Import
?导出表.
? Drop或者 truncate表.
?导入表.
? 迁移表: Alter Table Employees Move
? 拷贝行迁移的记录
?使用ANALYZE命令查找出行迁移记录.
?拷贝行迁移记录到新表中.
?删除原始表中行迁移记录.
?将新表中记录拷贝到原始表中.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/500314/viewspace-1069848/ ,如需转载,请注明出处,否则将追究法律责任。