`
streamsong
  • 浏览: 79891 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PCTFREE和PCTUSED及将LOB存到行外

阅读更多

今天的ADDM报告建议重建存放图片的表并增大PCTFREE,这可能和程序的逻辑有关,这套程序是先INSERT一条记录,但是此时LOB字段是空的,然后UPDATE这条记录,将图片加载到这条记录上。

查找结果 1: 缓冲区忙 - 热对象

受影响的是 .02 个活动会话, 占总活动的 3.46\%

------------------------------

对数据库块的读写争用消耗了大量数据库时间。

   建议案 1: 方案更改

   估计的收益为 .02 个活动会话, 占总活动的 3.46\%

   -------------------------------

   操作

      考虑使用更大的 PCTFREE 值重建 LOB "DIGITAL.SYS_LOB0000075645C00004$$" (对象 ID 75646)

      相关对象

         ID 75646 的数据库对象。

   原理

      SQL_ID "akqx47xp7tr8c" UPDATE 语句受到 "缓冲区忙" 等待的严重影响。

      相关对象

         SQL_ID akqx47xp7tr8c SQL 语句。

         update IMAGE set IMAGES=:1 where FILE_PATH=:2

   导致查找结果的故障现象:

   ------------

      对数据库块的读写争用消耗了大量数据库时间。

      受影响的是 .02 个活动会话, 占总活动的 3.46\%

         等待类 "并发" 消耗了大量数据库时间。

         受影响的是 .02 个活动会话, 占总活动的 3.46\%

    关于PCTFREEPCTUSED,很多时候在建表的时候都不会特意指定,使用的都是默认值,PCTFREE默认是10PCTUSED默认是40

SQL> create table tttt (id number,name varchar2(10));

表已创建。

SQL> select dbms_metadata.get_ddl('TABLE','TTTT','STREAM') FROM DUAL;

DBMS_METADATA.GET_DDL('TABLE','TTTT','STREAM')

--------------------------------------------------------------------------

  CREATE TABLE "STREAM"."TTTT"

   (    "ID" NUMBER,

        "NAME" VARCHAR2(10)

   ) SEGMENT CREATION DEFERRED

  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING

  TABLESPACE "USERS"

    也可以通过查看USER_TABLES视图查看PCTFREEPCTUSED的值,但是通常PCTUSER都是空。

SQL> select table_name,pct_free,pct_used from user_tables where table_name ='TTTT';

TABLE_NAME                       PCT_FREE   PCT_USED

------------------------------ ---------- ----------

TTTT                                   10

    可以在建表的时候指定PCTFREEPCTUSED的值,也可以通过ALTER TABLE语句修改表的PCTFREEPCTUSED的值。

SQL> create table tttt (id number,name varchar2(10)) pctfree 20 pctused 50;

表已创建。

SQL> alter table tttt pctfree 30 pctused 40;

表已更改。

    为了避免行迁移和行链接和均衡进出freelist的频率,通常会设置PCTFREEPCTUSEDORACLE通过牺牲空间来避免行迁移和行链接,也就是PCTFREE,主要是对UPDATE操作影响比较大,比如,一条含有VARCHAR2字段类型的记录,已经将近有了一个BLOCK,此时UPDATE操作将VARCHAR2的字段增大,这条记录可能超出了一个BLOCK,这是就会产生行链接,如果当这条记录的大小并没有超过一个BLOCK,但是这个BLOCK被其他的记录占用了一部分,此时如果UPDATE这条记录使这个BLOCK已经存不下这条记录,就会产生行迁移, PCTFREE被我理解成是ORACLE预留给UPDATE操作的空间,比如,PCTFREE的值是10,那么这个段上的每个数据换在新INSERT进数据的时候,都会预留10%的空间,以最大可能减少由于UPDATE操作产生的行迁移和行链接情况,如果UPDATE经常使记录变大,建议适当增大PCTFREE的值。PCTUSED主要是对INSERT影响较大,比如PCTUSED的值为40,那么只有这个数据块使用率没有超过整个数据块的40%,才会将数据INSERT到这个数据块上,否则INSERT的数据将插入到新的BLOCK较大的PCTFREE比较合适频繁更新的操作,因为如果更新是行记录变大,也不容易发生行迁移,而且会大大利用PCTFREE的空间不至于浪费,如果更新是行记录变小,还可以便于INSERT操作,较小的PCTFREE一般适合静态表或者只读的表,这样可以减少磁盘空间的浪费。

    PCTFREE的默认值是10,较大的值一般在20-25,较小的值一般是4-5PCTUSED的默认值是40,较大值一般是50PCTFREEPCTUSED的和一般不要超过90,那样ORACLE将更多地时间花费在处理空间利用上,如果插入行后,更新操作会增加已有行的长度,建议将PCTFREE设置20PCTFREE设置40如果插入行后,更新操作不会增加已有行的长度,建议将PCTFREE设置10PCTFREE设置50,如果是只读或静态表,建议将PCTFREE设置5PCTUSED设置40

    但是本案例修改PCTFREE并不能解决问题,这个数据库的BLOCK_SIZE16K,但是LOB字段中存的图片大小是2MB,要解决这个问题就需要将LOB存放在行外,通常LOB字段都相对较大,建表的时候就需要将LOB字段存放到行外,不和其他字段一起存放,也可以将LOB存到其他的表空间来提高性能。

SQL> create table stream(id number,name varchar2(10),pic blob) tablespace users

  2  lob (pic) store as securefile (tablespace thams disable storage in row

  3  pctversion 10);

表已创建。

         查看表存放的表空间信息。

SQL> select table_name,tablespace_name from user_tables where table_name='STREAM';

TABLE_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

STREAM                         USERS

         查看LOB字段存放的表空间信息。

SQL> SELECT TABLE_NAME,COLUMN_NAME,TABLESPACE_NAME FROM USER_LOBS WHERE TABLE_NAME='STREAM';

TABLE_NAME COLUMN_NAM TABLESPACE_NAME

---------- ---------- ---------------

STREAM     PIC        THAMS

         本案例用到了11g的新特性SECUREFILES,可以参考我之前写过的关于SECUREFILES的文章,(http://www.dbdream.org/?p=22)。

    上面的建表语句用到了disable storage in rowpctversion参数,下面解释下这两个参数的含义:

    disable storage in row:将LOB字段和表的其他字段不放到一起存放,也就是前文说到的将LOB字段存放到行外。

    enable storage in row:将LOB字段和表的其他字段存放到一起。

    pctversionLOB字段不写回滚段,利用pctversion参数来指定在LOB的存储空间中拿百分之多少的空间来存放旧的镜像来提供读一致性,上文指定10%的存储空间。

 

0
0
分享到:
评论

相关推荐

    文件更新系统

    pctfree 5 storage ( initial 2M next 1M minextents 1 maxextents unlimited pctincrease 0 ) tablespace tsp_comm ) pctfree 5 pctused 90 storage ( initial ...

    bbs论坛项目运用SSH框架Oracle数据库编写的一个简单示列项目

    pctfree 10 pctused 40 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key constraints alter table USERS ...

    Oracle分区表和索引

     但是可以有不同的物理属性,比如pctfree, pctused, and tablespaces.  分区独立性:即使某些分区不可用,其他分区仍然可用。  最多可以分成64000个分区,但是具有LONG or LONG RAW列的表不可以,但是有CLOB or ...

    平安数据库试题

    当需要对连接到数据库的用户user1限制起连接数,需操作()B a. 在init文件中修改session参数 b. 创建一个有连接限制的profile_new,并把user1的profile修改为profile_new c. drop users,重新创建一个新用户 d. 使用...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    10.2.5 PCTFREE和PCTUSED 345 10.2.6 LOGGING和NOLOGGING 348 10.2.7 INITRANS和MAXTRANS 349 10.3 堆组织表 349 10.4 索引组织表 352 10.5 索引聚簇表 368 10.6 散列聚簇表 376 10.7 有序散列聚簇表 386 ...

    阿里巴巴公司DBA笔试题.txt

    pctused and pctfree 表示什么含义有什么作用

    oracle_PLSQL_语法详细手册

    除了列名和描述外,还可以指定约束条件,存储参数和该表是否是个cluster的一部分. Schema 用来指定所建表的owner,如不指定则为当前登录的用户. Table_name 用来指定所创建的表名,最长为30个字符,但不可以数字开头(可为...

    Oracle数据库管理员技术指南

    5.2.10 将归档重做日志自动传送到备用 数据库 5.2.11 启动管理恢复 5.2.12 只读打开备用数据库 5.2.13 热备用数据库的维护 5.3 回顾 第6章 高级的失败切换方法 6.1 将 Oracle 并行服务器用于失败切换 6.2 ...

    Oracle事例

    14、查询从多少行到多少行的记录(可以用在web开发中的分页显示) select * from ( select rownum row_id,b.* from (select a.* from sys_oper a) b ) where row_id between 15 and 20 15、对公共授予访问权 ...

    JSP实现用户登录、注册和退出功能

    本文讲述使用JSP实现用户登录,包括用户登录、注册和退出功能等。 1.系统用例图 2.页面流程图 3.数据库设计 本例使用oracle数据库 创建用户表 包括id,username,password和email... pctfree 10 initrans 1 maxtran

    Oracle的回滚段存储内容分析

    事务在执行DML操作时,会首先将相关的数据块写入数据缓冲区中,数据缓冲区中存储的是DML操作相关的完整数据块,比如我们对表中的某一个记录执行update操作,oracle会将记录所在的数据块读入数据缓冲区中。...

    Toad 使用快速入门

    在运行结果窗口可提供用户定义的配置功能,支持LONG 和LONG RAW列,可以将数据卸出到磁盘、打印数据、编辑数据等等。 存储过程编辑器: 存储过程编辑器的主要功能是编辑、编译、测试、调试存储过程和触发器。TOAD...

    Oracle 簇的使用详解

    建立顺序是:簇→簇表→簇索引→数据创建簇的格式CREATE CLUSTER cluster_name(column date_type [,column datatype]…)[PCTUSED 40 | integer] [PCTFREE 10 | integer][SIZE integer][INITRANS 1 | integer] ...

    JBPM建表语句

    pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key constraints alter table JBPM4_DEPLOYMENT add...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    说明:将sql*plus屏幕中的内容输出到指定的文件 用法:开始印刷->spool 文件名 结束印刷->spool off 列子: 文件内容 9. 显示宽度 (linesize) 说明:设置显示行的宽度,默认是80个字符 用法:set linesize 120 ...

    2019年行政区域规划表(3月更新)

    pctfree 10 initrans 1 maxtrans 255 storage ( initial 256K next 8K minextents 1 maxextents unlimited ); -- Add comments to the table comment on table SYS_AREA is '行政区划表'; -- Add ...

    oracle 创建和删除索引

    删除索引 drop index CUS_LOWER_ENERGY_JLDNY; 新建一个索引 create index CUS_LOWER_ENERGY_JLDNY on ... pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited );

    Oracle从入门到精通

    1、表(TABLE)基本的存储单位,由行和列组成。.............. 2、方案:一个用户所有对象的命名集合。..................... 3、CTAS(子查询建表):................................... 4、截取:.................

Global site tag (gtag.js) - Google Analytics