今天的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\%。
关于PCTFREE和PCTUSED,很多时候在建表的时候都不会特意指定,使用的都是默认值,PCTFREE默认是10,PCTUSED默认是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视图查看PCTFREE和PCTUSED的值,但是通常PCTUSER都是空。
SQL> select table_name,pct_free,pct_used from user_tables where table_name ='TTTT';
TABLE_NAME PCT_FREE PCT_USED
------------------------------ ---------- ----------
TTTT 10
可以在建表的时候指定PCTFREE和PCTUSED的值,也可以通过ALTER TABLE语句修改表的PCTFREE和PCTUSED的值。
SQL> create table tttt (id number,name varchar2(10)) pctfree 20 pctused 50;
表已创建。
SQL> alter table tttt pctfree 30 pctused 40;
表已更改。
为了避免行迁移和行链接和均衡进出freelist的频率,通常会设置PCTFREE和PCTUSED。ORACLE通过牺牲空间来避免行迁移和行链接,也就是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-5,PCTUSED的默认值是40,较大值一般是50,PCTFREE和PCTUSED的和一般不要超过90,那样ORACLE会将更多地时间花费在处理空间利用上,如果插入行后,更新操作会增加已有行的长度,建议将PCTFREE设置20,PCTFREE设置40,如果插入行后,更新操作不会增加已有行的长度,建议将PCTFREE设置10,PCTFREE设置50,如果是只读或静态表,建议将PCTFREE设置5,PCTUSED设置40。
但是本案例修改PCTFREE并不能解决问题,这个数据库的BLOCK_SIZE是16K,但是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 row和pctversion参数,下面解释下这两个参数的含义:
disable storage in row:将LOB字段和表的其他字段不放到一起存放,也就是前文说到的将LOB字段存放到行外。
enable storage in row:将LOB字段和表的其他字段存放到一起。
pctversion:LOB字段不写回滚段,利用pctversion参数来指定在LOB的存储空间中拿百分之多少的空间来存放旧的镜像来提供读一致性,上文指定10%的存储空间。
分享到:
相关推荐
Oracle数据库是业界广泛使用的关系数据库管理系统,其提供的SQL语言广泛用于数据查询、更新、管理和控制。在数据库管理与维护中,掌握一些常用的Oracle SQL语句是非常必要的,它们能够帮助我们高效地解决问题和提高...
MSSM使用PCTFREE、PCTUSED和FREELIST等参数手动管理空间,而ASSM则通过位图跟踪空闲空间,简化管理,但不适用于包含大对象(LOB)的表空间。 在存储子句的优先级方面,段级别的存储参数优先于表空间级别的设置,...
MSSM允许用户通过PCTFREE、PCTUSED和FREELIST参数精细控制空间使用,而ASSM使用位图来跟踪可用空间,简化了空间管理,但只支持PCTFREE参数,并且不适用于包含大对象(LOB)的表空间。 总的来说,理解Oracle数据库的...
MSSM允许通过参数如PCTFREE、PCTUSED和FREELIST来精细控制数据块的使用。ASSM使用位图来跟踪段的可用空间,简化了空间管理,但不适用于包含大对象(LOB)的表空间。 总的来说,理解Oracle的这些基本概念和管理机制...
STORAGE子句在创建表时用于设定存储参数,如初始盘区大小、后续盘区增长等,PCTFREE和PCTUSED控制数据块的空间使用策略。 总的来说,这份复习资料覆盖了Oracle数据库的基础知识,包括物理结构、SQL语法、数据操作和...
Pctfree和Pctused控制数据块的更新和删除策略。 9. **存储空间管理**: ALTER TABLE语句可以用于手动分配存储空间,如分配固定大小的盘区。移动表到特定表空间并设定初始和后续盘区大小,需使用相应的ALTER TABLE...
8. 数据块空间管理参数PCTFREE和PCTUSED分别用于控制数据块在更新和删除时的空闲空间管理。 9. 控制文件在数据库恢复时起到关键作用,当出现失败故障,未永久写入数据文件的改动可以通过控制文件找回。 10. DBWR...
表空间`USERS`定义了存储位置,`PCTFREE`、`PCTUSED`、`STORAGE`等参数控制了存储分配和增长策略。 9.2.1 创建表时,可以定义多种数据类型,如字符类型(CHAR、VARCHAR2、NCHAR、NVARCHAR2、LONG)、数字类型...
1. **pctused 和 pctfree** pctused 和 pctfree 是Oracle数据库中用于控制数据块空间管理的两个重要参数。pctused 设定了一个阈值,当数据块中的自由空间小于这个百分比时,该数据块将从自由链表(freelist)中...
) 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的逻辑存储结构 - **段**:段是在数据库中用来组织相关...
相反,PCTUSED参数定义了当块中的自由空间低于某个比例时,Oracle会将该块重新放入自由列表中。 数据块的大小可配置,范围从2KB到32KB,如果启用Very Large Memory (VLM)支持,甚至可以达到64KB。在Oracle中,数据...
根据存储数据的类型,可以将段分为数据段、索引段、回退段、LOB 段和临时段。数据块是最小的 I/O 单元。 多进程 Oracle 实例系统 在多进程 Oracle 实例系统中,进程分为用户进程、后台进程和服务器进程。当一个...
- 数据块空间管理参数如`PCTFREE`和`PCTUSED`用于控制数据块内的空间使用策略。 **4. 手动分配存储空间:** - 使用`ALTER TABLE <表名> ALLOCATE EXTENT`命令手动分配存储空间。 - 示例:为`Student`表手动分配...
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 数据库管理与应用开发标准教程课后习题答案解析 #### 第二章:Oracle数据库... 这条语句将`Class`表移动到`SYSTEM`表空间,并设置了初始盘区大小为30KB,第二个盘区为20KB,且后续盘区大小不会增长。