- 浏览: 225734 次
- 性别:
- 来自: 重庆
文章分类
最新评论
-
fitzsu:
关于中文占多少字节的问题应该是跟字符集相关的,跟类型无关的对吗 ...
Oracle CHAR,VARCHAR,VARCHAR2,nvarchar类型的区别与使用 -
showzh:
...
Oracle CHAR,VARCHAR,VARCHAR2,nvarchar类型的区别与使用 -
ltian:
实话实说,让我云里雾里!不知道Hibernate缓存能力和云计 ...
OO + 分布式计算 = 软件架构的方向 -
蔡华江:
5.如果数据间引用不存在环路,还可以用递归查询来完成如果出现环 ...
一道数据库开发面试题 -
zydar:
自己不改~
springside3版本qWikiOffice
近来,有人要求我评估一个与 Oracle 数据库竞争的 RDBMS。在供应商的演示过程中,观众认为“最棒”的特性是,对联机重组的支持 — 该产品可以联机重新部署数据块,以使段的等价物更简洁,并且不会影响当前的用户。
那时,Oracle 还没有在 Oracle9i 数据库中提供这种功能。但是现在,有了 Oracle 数据库 10g,就可以轻松地联机回收浪费的空间和压缩对象—正好适合于起步者。
不过,在检验该特性之前,让我们看一看处理这项任务的“传统的”方法。
当前惯例
考虑让我们看一个段,如一张表,其中填满了块,如图 1 所示。在正常操作过程中,删除了一些行,如图 2 所示。现有就有了许多浪费的空间:(i) 在表的上一个末端和现有的块之间,以及 (ii) 在块内部,其中还有一些没有删除的行。
Oracle 不会释放空间以供其他对象使用,有一条简单的理由:由于空间是为新插入的行保留的,并且要适应现有行的增长。被占用的最高空间称为最高使用标记 (HWM),如图 2 所示。
但是,这种方法有两个主要的问题:
- 当用户发出一个全表扫描时,Oracle 始终必须从段一直扫描到 HWM,即使它什么也没有发现。该任务延长了全表扫描的时间。
- 当用直接路径插入行时 — 例如,通过直接加载插入(用 APPEND 提示插入)或通过 SQL*Loader 直接路径 — 数据块直接置于 HWM 之上。它下面的空间就浪费掉了。
在 Oracle9i 及其以前的版本中,可以通过删除表,然后重建表并重新加载数据来回收空间;或通过使用 ALTER TABLE MOVE 命令把表移动到一个不同的表空间中来回收空间。这两种处理方式都必须脱机进行。另外,可以使用联机表重组特性,但是这需要至少双倍的现有表空间。
在 10g中,该任务已经变得微不足道了;假如您的表空间中支持自动段空间管理 (ASSM),您现在可以缩小段、表和索引,以回收空闲块并把它们提供给数据库以作他用,让我们看看其中的缘由。
10g 中的段管理方式
设想有一个表 BOOKINGS,它保存有经由 Web 站点的联机登记。当一个登记确认后,就会把它存储在一个存档表 BOOKINGS_HIST 中,并从 BOOKINGS 表中删除该行。登记和确认之间的时间间隔依据客户有很大的不同,由于无法从删除的行获得足够的空间,因此许多行就插入到了表的 HWM 之上。
现在您需要回收浪费的空间。首先,准确地查明在可回收的段中浪费了多少空间。由于它是在支持 ASSM 的表空间中,您将不得不使用 DBMS_SPACE 包的 SPACE_USAGE 过程,如下所示:
declare l_fs1_bytes number; l_fs2_bytes number; l_fs3_bytes number; l_fs4_bytes number; l_fs1_blocks number; l_fs2_blocks number; l_fs3_blocks number; l_fs4_blocks number; l_full_bytes number; l_full_blocks number; l_unformatted_bytes number; l_unformatted_blocks number; begin dbms_space.space_usage( segment_owner => user, segment_name => 'BOOKINGS', segment_type => 'TABLE', fs1_bytes => l_fs1_bytes, fs1_blocks => l_fs1_blocks, fs2_bytes => l_fs2_bytes, fs2_blocks => l_fs2_blocks, fs3_bytes => l_fs3_bytes, fs3_blocks => l_fs3_blocks, fs4_bytes => l_fs4_bytes, fs4_blocks => l_fs4_blocks, full_bytes => l_full_bytes, full_blocks => l_full_blocks, unformatted_blocks => l_unformatted_blocks, unformatted_bytes => l_unformatted_bytes ); dbms_output.put_line(' FS1 Blocks = '||l_fs1_blocks||' Bytes = '||l_fs1_bytes); dbms_output.put_line(' FS2 Blocks = '||l_fs2_blocks||' Bytes = '||l_fs1_bytes); dbms_output.put_line(' FS3 Blocks = '||l_fs3_blocks||' Bytes = '||l_fs1_bytes); dbms_output.put_line(' FS4 Blocks = '||l_fs4_blocks||' Bytes = '||l_fs1_bytes); dbms_output.put_line('Full Blocks = '||l_full_blocks||' Bytes = ||l_full_bytes); end; / 输出结果如下: FS1 Blocks = 0 Bytes = 0 FS2 Blocks = 0 Bytes = 0 FS3 Blocks = 0 Bytes = 0 FS4 Blocks = 4148 Bytes = 0 Full Blocks = 2 Bytes = 16384
这个输出结果显示有 4,148 个块,具有 75-100% 的空闲空间 (FS4);没有其他空闲块可用。这里仅有两个得到完全使用的块。4,148 个块都可以回收。
接下来,您必须确保该表支持行移动。如果不支持,您可以使用如下命令来支持它:
alter table bookings enable row movement;
或通过 Administration 页上的 企业管理器 10g。您还要确保在该表上禁用所有基于行 id 的触发器,这是因为行将会移动,行 id 可能会发生改变。
最后,您可以通过以下命令重组该表中现有的行:
alter table bookings shrink space compact;
该命令将会在块内重新分配行,如图 3 所示,这就在 HWM 之下产生了更多的空闲块 — 但是 HWM 自身不会进行分配。
在执行该操作后,让我们看一看空间利用率所发生的改变。使用在第一步展示的 PL/SQL 块,可以看到块现在是如何组织的:
FS1 Blocks = 0 Bytes = 0 FS2 Blocks = 0 Bytes = 0 FS3 Blocks = 1 Bytes = 0 FS4 Blocks = 0 Bytes = 0 Full Blocks = 2 Bytes = 16384
注意这里的重要改变:FS4 块(具有 75-100% 的空闲空间)的数量现在从 4,148 降为 0。我们还看到 FS3 块(具有 50-75% 的空闲空间)的数量从 0 增加到 1。但是,由于 HWM 没有被重置,总的空间利用率仍然是相同的。我们可以用如下命令检查使用的空间:
SQL> select blocks from user_segments where segment_name = 'BOOKINGS'; BLOCKS --------- 4224
由该表占用的块的数量 (4,224) 仍然是相同的,这是因为并没有把 HWM 从其原始位置移开。可以把 HWM 移动到一个较低的位置,并用如下命令回收空间:
alter table bookings shrink space;
SQL> select blocks from user_segments where segment_name = 'BOOKINGS';
BLOCKS
----------
8
图 4:在收缩后,把空闲块返回给数据库。
alter table bookings shrink space cascade;
begin
if (dbms_space.verify_shrink_candidate
('ARUP','BOOKINGS','TABLE',1300000)
then
:x := 'T';
else
:x := 'F';
end if;
end;
/
PL/SQL 过程成功完成。
SQL> print x
X
--------------------------------
T
begin
if (dbms_space.verify_shrink_candidate
('ARUP','BOOKINGS','TABLE',30000)
then
:x := 'T';
else
:x := 'F';
end if;
end;
declare
l_used_bytes number;
l_alloc_bytes number;
begin
dbms_space.create_index_cost (
ddl => 'create index in_bookings_hist_01 on bookings_hist '||
'(booking_id, cust_name) tablespace users',
used_bytes => l_used_bytes,
alloc_bytes => l_alloc_bytes
);
dbms_output.put_line ('Used Bytes = '||l_used_bytes);
dbms_output.put_line ('Allocated Bytes = '||l_alloc_bytes);
end;
/
Used Bytes = 7501128
Allocated Bytes = 12582912
declare
l_used_bytes number;
l_alloc_bytes number;
begin
dbms_space.create_index_cost (
ddl => 'create index in_bookings_hist_01 on bookings_hist '||
'(booking_id, cust_name) tablespace users initrans 10',
used_bytes => l_used_bytes,
alloc_bytes => l_alloc_bytes
);
dbms_output.put_line ('Used Bytes = '||l_used_bytes);
dbms_output.put_line ('Allocated Bytes = '||l_alloc_bytes);
end;
/
Used Bytes = 7501128
Allocated Bytes = 13631488
declare
l_used_bytes number;
l_alloc_bytes number;
begin
dbms_space.create_table_cost (
tablespace_name => 'USERS',
avg_row_size => 30,
row_count => 30000,
pct_free => 20,
used_bytes => l_used_bytes,
alloc_bytes => l_alloc_bytes
);
dbms_output.put_line('Used:'||l_used_bytes);
dbms_output.put_line('Allocated:'||l_alloc_bytes);
end;
/
Used: 1261568
Allocated: 2097152
pct_free => 30
Used: 1441792
Allocated: 2097152
select * from
table(dbms_space.OBJECT_GROWTH_TREND
('ARUP','BOOKINGS','TABLE'));
TIMEPOINT SPACE_USAGE SPACE_ALLOC QUALITY
------------------------------ ----------- ----------- ------------
05-MAR-04 08.51.24.421081 PM 8586959 39124992 INTERPOLATED
06-MAR-04 08.51.24.421081 PM 8586959 39124992 INTERPOLATED
07-MAR-04 08.51.24.421081 PM 8586959 39124992 INTERPOLATED
08-MAR-04 08.51.24.421081 PM 126190859 1033483971 INTERPOLATED
09-MAR-04 08.51.24.421081 PM 4517094 4587520 GOOD
10-MAR-04 08.51.24.421081 PM 127469413 1044292813 PROJECTED
11-MAR-04 08.51.24.421081 PM 128108689 1049697234 PROJECTED
12-MAR-04 08.51.24.421081 PM 128747966 1055101654 PROJECTED
13-MAR-04 08.51.24.421081 PM 129387243 1060506075 PROJECTED
14-MAR-04 08.51.24.421081 PM 130026520 1065910496 PROJECTED
发表评论
-
Merge into bug?
2014-07-02 10:54 4109在ORACLE 11.2.0.3上执行merge into ... -
AWR 报告关键部分
2014-06-09 10:38 4831、后台等待事件 2、按Gets排序的SQL 3、按读取 ... -
DBLinks 新增加字段后,提示标识符无效
2014-06-06 15:03 1146在用DBlinks同步数据中,原表和目标表增加了 ... -
PowerDesigner 之 report html
2014-04-09 12:04 729谁说的PowerDesigner 导出的Html不好看?在相对 ... -
Oracle之行转列
2014-04-04 14:53 558select regexp_substr(in_code_k ... -
官方的linux下卸载oracle步骤
2010-05-19 16:40 17355 Removing Oracle SoftwareThis ... -
Oracle服务器如何科学组织RAID阵列
2010-05-11 13:37 1384我们在部署服务器时通 ... -
通过Oracle发送Email
2010-05-11 13:14 1409本篇是通过Oracle10g发送Email实例,该Proce ... -
bsd_sendemail
2010-05-11 13:02 1003create or replace procedure bsd ... -
Oracle PL/SQL编程规范指南
2010-05-11 12:31 1380一、PL/SQL编程规范之大 ... -
全面认识Oracle数据库字符集
2010-05-01 14:16 908什么是Oracle字符集 Oracle字符集是一个字节数 ... -
Oracle 系统表大全
2010-04-21 15:04 773数据字典dict总是属于Oracle用户sys的。 1、用户 ... -
Oracle中杀不掉的锁
2010-04-21 14:29 720一些ORACLE中的进程被杀掉后,状态被置为"kil ... -
flashback table
2010-04-07 10:50 1703小心误删除了某个表中 ... -
clob_to_varchar2
2010-03-18 18:31 827CREATE OR REPLACE FUNCTION kf_c ... -
一道数据库开发面试题
2010-03-18 17:56 1702已知表route,字段和内容如下: 起始节点 终止节点 ... -
PL/SQL的递归调用
2010-03-18 17:51 1075已知表route,字段和内容如下: 起始节点 终止节点 距离 ... -
分析函数3(Top/Bottom N、First/Last、NTile)
2010-03-18 17:42 1062一、带空值的排列: 假如被排列的数据中含有空值呢? SQL& ... -
利用oracle快照dblink解决数据库表同步问题
2009-12-30 08:48 1042--1、在目的数据库上,创建dblink drop publi ... -
Oracle 示例:Oracle Warehouse Builder 11g
2009-12-09 12:07 976http://www.oracle.com/technolog ...
相关推荐
例如,10g中的自动内存管理(Automatic Memory Management, AMM)可以动态调整SGA和PGA的大小,提高资源利用率。 #### 四、Oracle 9i/10g 服务器组件 - **服务器组件**:包括数据库服务器、应用服务器、中间件组件...
Oracle数据库10g是Oracle公司推出的一款革...综上所述,Oracle数据库10g通过网格计算、自动存储管理和数据库服务器网格等技术,实现了服务质量、成本效益和管理简易性的全面提升,为企业的IT基础设施提供了强大的支持。
Oracle数据库空间的管理和使用是数据库管理员的关键任务,它直接影响到数据库的性能和应用程序的响应速度。Oracle数据库将存储空间逻辑上划分为多个表空间,每个表空间由一个或多个物理数据文件组成。数据存储的基本...
其次,Data Guard功能在10g中得到强化,它提供了灾难恢复和保护机制,通过创建物理或逻辑备用数据库,确保数据的安全性。在数据丢失或损坏的情况下,Data Guard能快速恢复服务,减少业务中断时间。 再者,Oracle 10...
Oracle数据库10g标准版最适宜在中型企业环境中部署。它支持最多支持4个CPU的单个服务器,或者一个集群中最多4个CPU的集群服务器环境...还能够与Oracle数据库10g企业版完全向上兼容,当您的使用需求增长时保护您的投资。
通过阅读《ORACLE10G联机文档中英文对照Conceptes》,读者不仅可以深入了解Oracle数据库的工作原理,还能提高实际操作技能,对于数据库管理员、开发人员和IT专业人员来说,这是一份不可多得的学习资源。同时,双语...
本资料集“Oracle 10g 数据库管理艺术”深入探讨了Oracle 10g版本中的核心特性和管理技巧,旨在帮助数据库管理员(DBA)和IT专业人士提升在数据库管理领域的专业能力。 首先,Oracle 10g引入了Real Application ...
Oracle 数据库 11g 企业版提供了 Java 和 PL/SQL 的本地编译功能,允许使用 Java 和 PL/SQL 语言编写部署在数据库中的程序。 管理软件开发 Oracle 数据库 11g 企业版提供了多种管理软件开发工具,包括 Oracle SQL ...
在Oracle 10g中,表空间是数据存储的基本单位,用于组织和管理数据库对象。表空间由一个或多个数据文件组成,每个数据文件包含物理存储的数据块。此外,Oracle 10g引入了自动存储管理(ASM),简化了存储管理和性能...
安装 ORACLE10g 数据库需要在 Linux 操作系统中进行配置和设置。本文将详细介绍 Linux 中安装 ORACLE10g 数据库的步骤。 一、安装前准备 在安装 ORACLE10g 数据库之前,需要进行一些准备工作: 1. 安装 Red Hat ...
数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中。一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。 表 表是数据的逻辑存储单元,存储着用户的数据。表不是由表空间...
1. **数据存储与管理**:Oracle 10g采用关系型数据库模型,数据存储在表空间中,通过数据块、段、区等逻辑结构组织。源代码中会包含如何创建、管理这些数据结构的实现细节。 2. **SQL执行引擎**:源代码会揭示SQL...
3. **SQL与PL/SQL**:详细解释了SQL语言在Oracle 10g中的使用,包括DML(数据操作语言)、DDL(数据定义语言)和DCL(数据控制语言);PL/SQL是Oracle的编程语言,用于编写存储过程、函数、触发器等,这部分会介绍其...
为了深入学习和理解Oracle数据库管理,本教程将从数据库基础、Oracle服务器构成、用户管理、数据库启动与关闭、Oracle NET、数据字典、数据库存储管理和备份恢复等多个方面全面介绍Oracle数据库的管理和使用。...
Oracle10g数据库是Oracle公司推出的数据库管理系统,它在企业级数据存储和管理领域具有广泛的应用。本教程《Oracle10g数据库基础教程》由孙凤栋主编,旨在为初学者提供全面、深入的Oracle数据库知识。教程内容涵盖...
Oracle 10g数据库系统管理是Oracle公司推出的一款企业级数据库管理系统,主要针对大型企业和组织的数据存储、管理和分析需求。这个版本在前代的基础上进行了多项性能优化和功能增强,为数据库管理员(DBA)提供了更...
在Oracle 10g中,数据恢复是数据库管理的关键环节之一,它涉及到在数据丢失、损坏或系统故障后,通过各种技术手段恢复数据库至一个可用状态的过程。 ### 数据恢复的重要性 数据是现代企业的核心资产,一旦发生数据...