[转帖]Oracle性能优化之提升block的效率_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3838 | 回复: 0   主题: [转帖]Oracle性能优化之提升block的效率        下一篇 
derek
注册用户
等级:中校
经验:1550
发帖:209
精华:0
注册:2011-7-21
状态:离线
发送短消息息给derek 加好友    发送短消息息给derek 发消息
发表于: IP:您无权察看 2011-8-3 15:25:55 | [全部帖] [楼主帖] 楼主

1、避免动态分配的缺陷

    创建本地管理的表空间;

    合理设置segment的大小;

    监控将要扩展的segment:

SELECT owner, table_name, blocks, empty_blocks FROM dba_tables WHERE empty_blocks / (blocks+empty_blocks) < .1;
2、high water mark


  记录在segment header block中,在segment创建的时候设定在segment的起始位置,当记录被插入的时候以5个block的增量增加,truncate可以重设high water mark的位置,但delete不能。

    在full table scan中,oracle会读取high water mark以下的所有的数据块,所以high water mark以上的块也许会浪费存储空间,但不会降低性能。

    可以通过下列方法收回表中high water mark以上的块:

Alter table_name deallocate unused;


  对于high water mark以下的块:

    使用import/export工具:export数据;drop或truncate表;import数据。或者利用alter table tanle_name move命令去移动表的存储位置(此时需要重建索引)。

    3、表统计

    用analyize命令生成表统计,然后到dba_table查询相关信息。

ANALYZE TABLE ndls.t_wh_shipping_bill COMPUTE STATISTICS;
SELECT num_rows, blocks, empty_blocks as empty,avg_space, chain_cnt, avg_row_len FROM dba_tables WHERE owner ='NDLS' AND table_name='T_WH_SHIPPING_BILL';


北京联动北方科技有限公司

     4、block size

    通过下列方法可以最小化block的访问次数:

    使用更大的block size;紧密压缩行;阻止行镜像。后两者存在冲突,越多的���被压缩在一个block里,越容易产生镜像。

    Block size 在数据库创建的时候设定,不能被轻易改变,是读取数据文件时最小的IO单元,大小范围是2K-64K,应该设置成OS块的整数倍,小于或等于OS IO时能读取的存储区域。

    较小的block size的优点:极少block竞争;有利于较小的行和随机访问。缺点是存在相当高的成本,每个block的行数更少,可能需要读取更多的index块。

    Block size的选择影响系统的性能,在一个OLTP环境中,较小的block size更合适,而在DSS环境中,适宜选择较大的block size。

     5、PCTFREE、PCTUSED

    1)PCTFREE、PCTUSED使你能控制一个segment里所有数据块里free space的使用。

    PCTFREE:一个数据块保留的用于块里已有记录的可能更新的自由空间占block size的最小比例。

    PCTUSED:在新记录被插入block里之前这个block可以用于存储行数据和其他信息的空间所占的最小比率。

    2)这两个参数的使用

    如果创建表的时候指定pctfree=20%,oracle会在这个表的data segment的每个block都保留20%的空间用于已有记录的更新。Block的已使用空间上升到整个block size的80%时,这个block将移出free list;在提交了delete、update之后,oracle server处理这条语句并检查对应block的已使用空间是否低于PCTUSED,如果是,则这个block放进free list。

    3)PCTFREE、PCTUSED的设定

• PCTFREE
– Default 10
– Zero if no UPDATE activity
– PCTFREE = 100 × upd / (average row length)
• PCTUSED
– Default 40
– Set if rows deleted
– PCTUSED = 100 – PCTFREE – 100 × rows × (average row length) / blocksize


  其中,upd : the average amount added by updates, in bytes。This is determined by subtracting the average row length of intercurrent average row length;

    average row length:在运行了analyize命令之后,这个值可以从dba_tables中的avg_row_len列中获得。

rows : the number of rows to be deleted before free list maintenance occurs。


  4)Delete、update可以增加block的自由空间,但是释放出来的空间有可能是不连续的,oracle在下列情况下会对碎片进行整理:一个block有足够的自由空间容纳row piece,但是由于每个碎片都较小以至这个row piece不能存放在一个连续的section中。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论