首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>linux数据库>oracle>正文

实例讲解表碎片的具体起因及解决的办法

http://www.oklinux.cn  2008-02-25  来源: 赛迪网 李丝  会员收藏  游客收藏  【 】 

表碎片的相关知识:

什么是水线(High Water Mark)?

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

所有的Oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或HWM。这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。但是如果我们在表上使用了truncate命令,则该表的HWM会被重新置为0。

HWM数据库的操作有如下影响:

a) 全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。

b) 即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。

如何知道一个表的HWM?

a) 首先对表进行分析:

ANALYZE TABLE <tablename> ESTIMATE/COMPUTE STATISTICS;
b) SELECT blocks, empty_blocks, num_rows 
FROM user_tables 
WHERE table_name = <tablename>;

BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。

EMPTY_BLOCKS 代表分配给该表,但是在水线以上的数据库块,即从来没有使用的数据块。

让我们以一个有28672行的BIG_EMP1表为例进行说明:

1) SQL> SELECT segment_name,segment_type,blocks 
FROM dba_segments 
WHERE segment_name='BIG_EMP1'; 
SEGMENT_NAME SEGMENT_TYPE BLOCKS EXTENTS 
----------------------------- ----------------- ---------- ------- 
BIG_EMP1 TABLE 1024 2 
1 row selected.

2) SQL> ANALYZE TABLE big_emp1 ESTIMATE STATISTICS; 
Statement processed. 

3) SQL> SELECT table_name,num_rows,blocks,empty_blocks 
FROM user_tables 
WHERE table_name='BIG_EMP1'; 
TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS 
------------------------------ ---------- ---------- ------------ 
BIG_EMP1 28672 700 323 
1 row selected. 

注意:
BLOCKS   EMPTY_BLOCKS (700 323=1023)比DBA_SEGMENTS.BLOCKS少个数据库块,
这是因为有一个数据库块被保留用作segment header。DBA_SEGMENTS.BLOCKS 
表示分配给这个表的所有的数据库块的数目。USER_TABLES.BLOCKS表示已经使
用过的数据库块的数目。

4) SQL> SELECT COUNT (DISTINCT 
DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)|| 
DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used" 
FROM big_emp1; 
Used 
---------- 
700 
1 row selected. 

5) SQL> DELETE from big_emp1; 
28672 rows processed. 

6) SQL> commit; 
Statement processed. 

7) SQL> ANALYZE TABLE big_emp1 ESTIMATE STATISTICS; 
Statement processed. 

8) SQL> SELECT table_name,num_rows,blocks,empty_blocks 
FROM user_tables 
WHERE table_name='BIG_EMP1'; 
TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS 
------------------------------ ---------- ---------- ------------ 
BIG_EMP1 0 700 323 
1 row selected. 

9) SQL> SELECT COUNT (DISTINCT 
DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)|| 
DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used" 
FROM big_emp1; 
Used 
---------- 
0 -- 这表名没有任何数据库块容纳数据,即表中无数据
1 row selected. 

10) SQL> TRUNCATE TABLE big_emp1; 
Statement processed. 

11) SQL> ANALYZE TABLE big_emp1 ESTIMATE STATISTICS; 
Statement processed. 

12) SQL> SELECT table_name,num_rows,blocks,empty_blocks 
2> FROM user_tables 
3> WHERE table_name='BIG_EMP1'; 
TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS 
------------------------------ ---------- ---------- ------------ 
BIG_EMP1 0 0 511 
1 row selected. 

13) SQL> SELECT segment_name,segment_type,blocks 
FROM dba_segments 
WHERE segment_name='BIG_EMP1'; 
SEGMENT_NAME SEGMENT_TYPE BLOCKS EXTENTS 
----------------------------- ----------------- ---------- ------- 
BIG_EMP1 TABLE 512 1 
1 row selected.
共6页: 上一页 1 [2] [3] [4] [5] [6] 下一页

上一篇:不通过"lower"等函数查询大小写的内容   下一篇:Oracle 11g新特性──初始化文件的管理


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·不通过"lower"等函数查询大小写的内容
·Oracle 11g新特性──初始化文件的管理
·Oracle 10g "DataGuard"的日志传输方式
·与基于锁的方案相比稍显复杂的非阻塞算法
·通过create datafile方式重新创建文件
·在线日志文件都是active或current的现象
·快速掌握"Oracle"数据库的启动和关闭
·SQL Server 2008的新特性概述:集成服务
·进行LOGMNR操作时发现空列名的具体原因
·实例讲解清除Oracle10g RAC CRS的方法
·"Oracle"闪回功能恢复偶然丢失的数据
·同时使用数据库链和序列时的注意事项
·如何查看"Control File"中保存的内容
·监控数据库性能的"SQL"语句都有哪些?
·RAC环境中查询不到其他实例执行的SQL
·建库的过程中DBCA报错,错误号为ORA-12547
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·讲解Oracle移动数据文件到新分区的过程
·如何使用Ruby脚本调用Oracle存储过程
·哪些因素可以影响Oracle数据库的性能
·带你深入了解Oracle数据库的进制转换
·讲解V$Datafile_Header相关字段的使用
·探讨基于不绑定变量与绑定变量的柱状图
·pl/sql developer中TIMESTAMP的显示格
·教你快速掌握如何使用"Opatch"打补丁
·如何调整"Oracle"数据库服务器的性能
·视图上含有row_number分析函数没法走索
·Linux自动备份MySQL数据库的实用方法
·如何更改rac的vip地址和集群互联地址
  阅读排行
·如何修改遗失的MySQL的ROOT用户密码
·详解远程SHELL下安装配置RedHat ES 5的
·教你如何将MySQL数据库的密码恢复
·教你在MySQL从口令恢复设置的密码
·在 Oracle Enterprise Linux 上升级到
·oracle9i installation on fedora core
·Oracle Instant client介绍
·Oracle高级复制(同步复制)配置步骤详细
·用Oracle归档日志进行恢复的方法
·Linux下的Oracle数据库编程详解
·Linux下Oracle9i RMAN备份及恢复步骤介
·带你轻松接触一些比较常用的sql*plus命
·Oracle的快照复制
·Oracle HA 在Unix上双机环境的安装指南
·Oracle 数据库存储结构简介
网摘收藏: