`
streamsong
  • 浏览: 82536 次
  • 性别: 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
分享到:
评论

相关推荐

    常用的Oracle SQL 语句

    Oracle数据库是业界广泛使用的关系数据库管理系统,其提供的SQL语言广泛用于数据查询、更新、管理和控制。在数据库管理与维护中,掌握一些常用的Oracle SQL语句是非常必要的,它们能够帮助我们高效地解决问题和提高...

    Oracle基础知识第八讲.pptx

    MSSM使用PCTFREE、PCTUSED和FREELIST等参数手动管理空间,而ASSM则通过位图跟踪空闲空间,简化管理,但不适用于包含大对象(LOB)的表空间。 在存储子句的优先级方面,段级别的存储参数优先于表空间级别的设置,...

    Oracle基础知识PPT学习教案.pptx

    MSSM允许用户通过PCTFREE、PCTUSED和FREELIST参数精细控制空间使用,而ASSM使用位图来跟踪可用空间,简化了空间管理,但只支持PCTFREE参数,并且不适用于包含大对象(LOB)的表空间。 总的来说,理解Oracle数据库的...

    Oracle基础知识PPT课件.pptx

    MSSM允许通过参数如PCTFREE、PCTUSED和FREELIST来精细控制数据块的使用。ASSM使用位图来跟踪段的可用空间,简化了空间管理,但不适用于包含大对象(LOB)的表空间。 总的来说,理解Oracle的这些基本概念和管理机制...

    oracle复习资料

    STORAGE子句在创建表时用于设定存储参数,如初始盘区大小、后续盘区增长等,PCTFREE和PCTUSED控制数据块的空间使用策略。 总的来说,这份复习资料覆盖了Oracle数据库的基础知识,包括物理结构、SQL语法、数据操作和...

    oracle_10g标准教程课后答案

    Pctfree和Pctused控制数据块的更新和删除策略。 9. **存储空间管理**: ALTER TABLE语句可以用于手动分配存储空间,如分配固定大小的盘区。移动表到特定表空间并设定初始和后续盘区大小,需使用相应的ALTER TABLE...

    数据库复习材料.doc

    8. 数据块空间管理参数PCTFREE和PCTUSED分别用于控制数据块在更新和删除时的空闲空间管理。 9. 控制文件在数据库恢复时起到关键作用,当出现失败故障,未永久写入数据文件的改动可以通过控制文件找回。 10. DBWR...

    Oracle模式对象基础教案.pptx

    表空间`USERS`定义了存储位置,`PCTFREE`、`PCTUSED`、`STORAGE`等参数控制了存储分配和增长策略。 9.2.1 创建表时,可以定义多种数据类型,如字符类型(CHAR、VARCHAR2、NCHAR、NVARCHAR2、LONG)、数字类型...

    阿里巴巴校园招聘Oracle_DBA笔试题及参考答案.doc

    1. **pctused 和 pctfree** pctused 和 pctfree 是Oracle数据库中用于控制数据块空间管理的两个重要参数。pctused 设定了一个阈值,当数据块中的自由空间小于这个百分比时,该数据块将从自由链表(freelist)中...

    Oracle第9章模式对象.pptx

    ) TABLESPACE USERS PCTFREE 10 PCTUSED 40 STORAGE(INITIAL 50K NEXT 50K MAXEXTENTS 10 PCTINCREASE 25); 表名必须是合法标识符,长度为1~30字节,且以字母开头,可以包含字母(A~Z,a~z)、数字(0~9)、...

    存储结构与关联

    - **PCTFREE/PCTUSED**:分别用于控制块内预留的空闲空间比例和已使用的空间比例,以优化更新操作和插入操作。 #### Block Space Usage - **PCTFREE**:保留的空闲空间百分比,用于减少更新操作时可能发生的页分裂...

    Oracle复习资料答案(最新)

    - **控制文件**:控制文件是记录数据库物理结构相关信息的关键文件之一,其中包括数据库名称、数据文件和重做日志文件的路径及状态等信息。 #### 二、Oracle的逻辑存储结构 - **段**:段是在数据库中用来组织相关...

    ORACLE 10G 学习资源

    相反,PCTUSED参数定义了当块中的自由空间低于某个比例时,Oracle会将该块重新放入自由列表中。 数据块的大小可配置,范围从2KB到32KB,如果启用Very Large Memory (VLM)支持,甚至可以达到64KB。在Oracle中,数据...

    oracle10g数据库管理应用与开发课后答案借鉴.pdf

    根据存储数据的类型,可以将段分为数据段、索引段、回退段、LOB 段和临时段。数据块是最小的 I/O 单元。 多进程 Oracle 实例系统 在多进程 Oracle 实例系统中,进程分为用户进程、后台进程和服务器进程。当一个...

    ORACLE学习

    - 数据块空间管理参数如`PCTFREE`和`PCTUSED`用于控制数据块内的空间使用策略。 **4. 手动分配存储空间:** - 使用`ALTER TABLE <表名> ALLOCATE EXTENT`命令手动分配存储空间。 - 示例:为`Student`表手动分配...

    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、对公共授予访问权 ...

    oracle_10g数据库管理_应用开发_标准教程》课后习题答案.doc

    ### Oracle 10g 数据库管理与应用开发标准教程课后习题答案解析 #### 第二章:Oracle数据库... 这条语句将`Class`表移动到`SYSTEM`表空间,并设置了初始盘区大小为30KB,第二个盘区为20KB,且后续盘区大小不会增长。

Global site tag (gtag.js) - Google Analytics