指定表压缩
可以为以下项指定表压缩:
• 整个按堆组织的表
• 分区表(每个分区可具有一种不同类型或级别的压缩。)
• 嵌套表的存储
你无法:
• 为列数多于255 的表指定基本压缩和OLTP 压缩
• 如果表是针对直接加载而压缩的,则你无法删除列;但如果表使用OLTP 压缩,则可删除
指定表压缩
可以为以下项指定表压缩:
• 整个按堆组织的表(在relational_table 或object_table 的physical_properties 子句中)
• 分区表(每个分区可具有一种不同类型或级别的压缩。)
• 嵌套表的存储(在nested_table_col_properties子句中)
表压缩具有以下限制:
• 不支持对列数多于255 的表使用COMPRESS FOR OLTP和COMPRESS BASIC
• 无法从针对直接加载操作压缩的表中删除列,不过可以将这类列设置为未使用。
ALTER TABLE... drop_column_clause 的所有操作对使用OLTP 压缩的表有效
• 使用Hybrid Columnar 压缩的表不支持逻辑备用、Streams 和LogMiner
使用压缩指导
压缩指导:
• 分析对象,估计不同压缩方法所节省的空间
• 帮助确定应用程序的正确压缩级别
• 推荐各种压缩策略
– 为特定的数据集选取正确的压缩算法
– 按特定列进行排序,以提高压缩比率
– 提供各种压缩算法的折衷方案
• 适用于OLTP 压缩(通过EM)
使用压缩指导
压缩指导分析数据库对象,并确定每个压缩级别可实现的预期压缩比率。因此,它可帮助你确定应用程序的正确压缩级别。该指导推荐各种压缩策略。当从EM 访问压缩指导时,它将确定OLTP 压缩。
使用DBMS_COMPRESSION程序包
确定最佳压缩比率:
BEGIN
DBMS_COMPRESSION.GET_COMPRESSION_RATIO ('USERS','SH','SALES',
NULL,DBMS_COMPRESSION.COMP_FOR_OLTP,blkcnt_cmp, blkcnt_uncmp,
rowcnt_cmp, rowcnt_uncmp, comptype);
DBMS_OUTPUT.PUT_LINE('Blk count compressed= ' || blkcnt_cmp);
DBMS_OUTPUT.PUT_LINE('Blk countuncompressed = ' ||
blkcnt_uncmp);
DBMS_OUTPUT.PUT_LINE('Row count per blockcompressed = ' ||
rowcnt_cmp);
DBMS_OUTPUT.PUT_LINE('Row count per blockuncompressed = ' ||
rowcnt_uncmp);
DBMS_OUTPUT.PUT_LINE('Compression type = '|| comptype);
DBMS_OUTPUT.PUT_LINE('Compression ratio=
'||blkcnt_uncmp/blkcnt_cmp||' to 1');
使用DBMS_COMPRESSION程序包
DBMS_COMPRESSION程序包提供的压缩指导帮助你为指定表确定可预期的压缩比率。
该指导将分析数据库中的对象,确定可能达到的压缩比率,并建议最佳压缩级别。除了DBMS_COMPRESSION程序包之外,还可以在现有指导框架内使用该压缩指导(通过DBMS_ADVISOR程序包)。
为了确定压缩比率,DBMS_COMPRESSION程序包提供了以下子程序:
• GET_COMPRESSION_RATIO过程,可针对未压缩表给出可行的压缩比率。
• GET_COMPRESSION_TYPE过程,针对给定行返回压缩类型。
压缩表数据

Oracle DB 支持以下三种表压缩方法:
• 基本表压缩
•OLTP 表压缩
• Hybrid Columnar 压缩(通过Exadata)
预先表空间监视
数据库以下列方式预先管理表空间的磁盘空间使用量:
• 表空间的可用磁盘空间变低,以及特定段空间不足时,系统会通过数据库预警通知你。
然后你就可以为表空间提供更多磁盘空间,以避免空间不足的情况发生。
• 收集的信息被存储在自动工作量资料档案库(AWR) 中,用于执行增长趋势分析以及计划数据库的容量。
要在Oracle EnterpriseManager 中查看和修改表空间信息,请在“Database(数据库)”主页中选择“Server(服务器)”,然后选择“Tablespaces(表空间)”。选择需要的表空间,然后单击“Edit(编辑)”按钮。
阈值和解决空间问题

通过以下方法解决空间问题:
• 添加数据文件或调整数据文件大小
• 将AUTOEXTEND设置为ON
• 收缩对象
• 减少UNDO_RETENTION
• 检查临时表空间中是否存在长时间运行的查询
阈值和解决空间问题
表空间阈值定义为“满”,或者定义为表空间中的可用空间。严重阈值和警告阈值是应用于表空间的两个阈值。DBMS_SERVER_ALERT程序包中包含用于设置和获取阈值的过程。
达到表空间限制大小时,将引发相应的预警。阈值以表空间大小的百分比,或剩余的空闲字节数表示。此值在内存中计算。可以为表空间同时定义百分比和字节形式的阈值。它们中的任何一个或两者都可以生成预警。
理想的警告阈值触发值设置会生成这样的预警:既能确保有足够时间来解决问题,使其不会变成严重状态,又不至于在空间尚未成为问题时干扰你。
预警指示DBA 可以通过执行以下一项或多项操作来解决问题:
• 向表空间添加更多空间,方法是添加一个文件或调整现有文件的大小,或者使现有文件可自动扩展
• 在包含任何可自动扩展文件的磁盘上释放空间
• 收缩表空间中的稀疏对象
监视表空间的空间使用量

• 只读表空间和脱机表空间:不要设置预警。
• 临时表空间:阈值对应于会话当前使用的空间。
• 还原表空间:阈值对应于活动区和未到期区所使用的空间。
• 可自动扩展的文件:阈值基于最大文件大小。
监视表空间的空间使用量
数据库在执行常规的空间管理活动时跟踪空间使用情况。MMON进程每10 分钟汇总一次此信息。达到或超过了表空间的阈值时,将触发预警。
• 不应在处于只读模式的表空间或已脱机的表空间上标记预警,因为在这些表空间上无法进行太多操作。
• 在临时表空间中,阈值必须定义为对表空间中已用空间的限制。
• 对于还原的表空间,如果某个区中不包含活动或未到期的还原操作,则该区可以重用。
计算阈值违规时,活动区和未到期区总体被视为已用空间。
• 对于包含可自动扩展文件的表空间,将根据你指定的最大文件大小或最大OS 文件大小来计算阈值。
收缩段

图表描述了表收缩操作的两个阶段。第一个阶段执行压缩。在此阶段,行将尽可能移动到段的左侧部分。在内部,行将由数据包移动,以避免锁定问题。移动完行后,将启动收缩操作的第二阶段。在此阶段中,将调整高水位标记(HWM),并释放未使用的
空间。
如果有长时间运行的查询,而且这些查询可能跨越收缩操作,并尝试从已回收的块中读取数据,则COMPACT子句会很有用。指定SHRINK SPACE COMPACT子句时,收缩操作的进度将保存在相应段的位图块中。这意味着下次在同一个段上执行收缩操作时,Oracle DBServer 可以记住已经执行过的操作。然后你就可以在非峰值时段重新发出SHRINK SPACE子句,无需使用COMPACT子句即可完成第二阶段。
收缩操作的结果
• 改善性能和空间使用情况
• 维护索引
• 不执行触发器
• 可以减少迁移行的数量
• 建议在IOT 上重建二级索引

收缩稀疏填充的段可以提高对该段执行扫描操作和DML 操作的性能。这是因为在收缩段后,需要查看的块减少了。尤其体现在下列方面:
• 全表扫描(块变少、变密)
• 改善索引访问(由于树变得更紧凑,因此减少了ROWID范围扫描时的I/O 次数)
另外,通过收缩稀疏填充的段,还可以提高数据库内空间使用效率,因为在对象需要空间时有更多空闲空间可以使用。
在段收缩操作期间将保证索引依赖关系。收缩了相应表后,索引处于可用状态。因此,不需要进一步维护。
实际收缩操作在内部作为INSERT/DELETE操作进行处理。但是,不执行任何DML 触发器,因为数据本身并未发生变化。
段收缩操作的一个可能结果是迁移行的数量减少。但是,你不应总是依赖段收缩来减少迁移行数量。因为段收缩操作可能不会触及段中的所有块。因此,不能保证所有迁移行都得到处理。
注:建议执行收缩操作之后在索引表(IOT) 上重建二级索引。
回收ASSM 段内的空间
• 联机原地操作
• 只适用于位于ASSM 表空间中的段
• 候选段类型包括:
– 按堆组织的表和索引表
– 索引
– 分区和子分区
– 实体化视图和实体化视图日志
使用ASSM 回收空间
收缩操作是一个联机原地操作,因为不需要额外的数据库空间即可执行此操作。
• 无法在由空闲列表管理的段上执行收缩操作。可以收缩自动段空间管理的表空间中的段。但是,不能收缩ASSM 表空间中存储的下列对象:
- 集群中的表
- 包含LONG列的表
- 包含提交时实体化视图的表
- 包含基于ROWID的实体化视图的表
-IOT 映射表
- 包含基于函数的索引的表
• 必须为按堆组织的段启用ROW MOVEMENT。
段指导:概览
段指导可标识具有可以回收的空间的段。它通过检查自动工作量资料档案库(AWR) 中的使用情况和增长统计数据以及对段中的数据进行采样来执行分析。可以将其配置为定期自动运行,也可以根据需要(手动)运行它。定期调度的段指导运行称为“自动段指导”。提供建议之后,你可以选择实施这些建议。可以在段级别或表空间级别调用收缩指导。
EM 数据库控制台是段指导的接口。可以从EM 中的几个位置访问段指导:
• “Advisor Central(指导中心)”页
• “Tablespaces(表空间)”页
• 方案对象页
使用数据库控制台可以选择不同的输入信息,并可以调度一个调用段指导的作业来获得收缩建议。可以在表空间环境中或方案对象环境中调用段指导向导,没有相关环境也可以调用。
段指导可以根据采样分析、历史信息和未来增长趋势来提供建议。
段指导
在“Server(服务器)”页中的“Storage(存储)”部分,选择“Tablespaces(表空间)”。
在“Tablespaces(表空间)”页上,选择要对其执行收缩分析的表空间,然后在“Actions(操作)”下拉列表中选择“Run Segment Advisor(运行段指导)”。单击“Go(执行)”
可以打开“Segment Advisor(段指导)”初始页。必须从“comprehensive(综合)”和“limited(有限制)”分析模式中选择一种。在综合模式下,分析时间较长,因为指导会对段进行采样以确定正确的目标。
一直单击“Continue(继续)”,回答指导的各个问题。你在“Segment Advisor: Review(段指导: 复查)”页上结束操作,可以在该页上复查分析内容的详细资料。段指导分析作为调度作业运行,因此可以从“Advisor Central(指导中心)”页检查已调度的任务。完成后,可以检查指导的建议。
注:在段指导中,可以指定分析操作的持续时间。这样,可以限制指导用于生成建议的时间。一般说来,分析时段越长,得到的结果就越全面。结果存储在AWR 中,可以稍后查看。使用“Number of days to retain(保留天数)”选项可以告知Oracle DB Server 这些结果应在AWR 中保留多少天后再清除。
实施建议
段指导完成其作业后,你可以查看建议的详细资料并直接实施建议。
注:在收缩按堆组织的表之前,必须在该表上启用行移动功能。可以使用“Edit Table(编辑表)”页上“Options(选项)”选项卡中的“Database Control(数据库控制)”来进行此操作。
自动段指导
• 由设置为在默认维护窗口期间运行的调度程序作业启动:
– 每个工作日的晚上,星期一至星期五,从晚上10:00 至次日凌晨2:00
– 星期六和星期日,两个窗口都开始于早上6:00,并持续20 小时
• 检查数据库统计信息,对段数据采样,然后选择以下对象进行分析:
– 超过了严重或警告阈值的表空间
– 包含活动最多的段
– 增长率最高的段
自动段指导
自动段指导是由配置为在默认维护窗口期间运行的调度程序作业启动的。默认维护窗口是在调度程序中指定的,其初始定义如下:
• 每个工作日的晚上,星期一至星期五,从晚上10:00 至次日凌晨2:00(每晚4 小时)
• 周末,星期六和星期日早上6:00,每天持续20 小时
自动段指导不会分析每个数据库对象。而是检查数据库统计信息,对段数据采样,然后选择以下对象进行分析:
• 超过了严重或警告空间阈值的表空间
• 包含活动最多的段
• 增长率最高的段
如果选择了某个对象进行分析,但维护窗口在段指导能处理该对象之前失效了,则该对象将在下一次自动段指导运行中分析。不能更改自动段指导选择进行分析的那组表空间和段。
但是,可以启用或禁用自动段指导作业,更改自动段指导的计划运行期间,或者调整自动段指导的系统资源利用率。
使用EM 手动收缩段
使用EM 手动收缩段
此外(相对于实施段指导的建议),还可以收缩与特定数据库对象关联的各个段。例如,在“Database(数据库)”主页中选择“Schema(方案)”文件夹选项卡,然后单击“Database Objects(数据库对象)”部分中的“Tables(表)”链接。在“Tables(表)”页上选择表,接着在“Actions(操作)”下拉列表中选择“Shrink Segment(收缩段)”。
然后单击“Go(执行)”按钮。这样将打开“Shrink Segment(收缩段)”页,你可以在其中选择要收缩的从属段。可以选择只压缩空间,或者选择压缩并释放空间。还可以选择CASCADE选项。
完成后,单击“Continue(继续)”链接。这样,收缩语句将作为调度作业提交。
使用SQL 收缩段
使用SQL 收缩段
因为在按堆组织的段中,收缩操作可能会导致ROWID发生更改,所以在该段上执行收缩操作之前,必须在相应段上启用行移动。默认情况下,在段级别上行移动处于禁用状态。
要启用行移动,需要使用CREATE TABLE或ALTER TABLE命令的ENABLE ROW MOVEMENT子句。第一个示例对此进行了阐述。
使用ALTER命令可以针对对象调用段收缩。对象可以是下列类型之一:表(按堆组织的表或索引表)、分区、子分区、LOB(数据和索引段)、索引、实体化视图或实体化视图日志。
使用SHRINK SPACE子句可以收缩段中的空间。如果指定了CASCADE,则收缩行为将级联到所有支持收缩操作的从属段,但实体化视图、LOB 索引和IOT(索引表)映射表例外。第二个示例展示了SHRINK SPACE子句。
在索引段中,收缩操作将首先合并索引,然后压缩数据。示例3 显示了一个收缩LOB 段的命令,并假设RESUME列为CLOB。
示例4 显示了一个收缩IOT 溢出段的命令,此段属于EMPLOYEES表。
管理可恢复的空间分配
可恢复的语句有下列特性:
• 使用可恢复的语句,可以挂起大型操作,而不是收到错误
• 使用可恢复的语句,当操作挂起时,你可以解决问题,然后继续进行,无须重新开始
• 在下列条件下,可恢复的语句将挂起:
– 空间不足
– 达到了最大区数
– 超出了空间限额
• 可恢复的语句可以多次挂起和恢复
管理可恢复的空间分配
Oracle DB Server 提供了一种方法,可以在空间分配失败时挂起大型数据库操作,稍后再恢复执行。使用这种方法,就有机会采取更正措施,而不是让Oracle DB Server 向用户返回错误。更正了错误条件后,挂起的操作将自动恢复。这种功能称为“可恢复的空间分配”。受影响的语句称为“可恢复的语句”。仅当为系统或会话启用了可恢复的语句功能时,语句才能在可恢复模式下执行。
挂起语句时将自动挂起事务处理。因此在SQL 语句的挂起和恢复过程中,将保留所有事务处理资源。错误条件不再存在时(例如在用户干预之后,或者很可能在其它查询释放了排序空间之后),挂起的语句将自动恢复执行。出现下列条件之一时,可恢复的语句将挂起:
• 空间不足条件
• 达到了最大区数条件
• 超出了空间限额条件
可恢复的语句有一个与之关联的挂起超时间隔。可恢复的语句的挂起时间超过超时间隔(默认为2 小时)后将重新激活自身,并向用户返回异常错误。可恢复的语句可以多次挂起和恢复。
注:达到最大区数错误仅发生在字典管理的表空间中。
使用可恢复的空间分配
• 如果查询、DML 操作和特定DDL 操作遇到空间不足错误,则可恢复这些操作。
• 可以通过SQL、PL/SQL、SQL*Loader 和数据泵实用程序或Oracle 调用接口(OCI) 来发出可恢复的语句。
• 仅当某条语句的会话已由下列操作之一启用时,该语句才可以在可恢复模式下执行:
– RESUMABLE_TIMEOUT初始化参数被设置为非零值。
– 发出了ALTER SESSIONENABLE RESUMABLE语句:
ALTER SESSION ENABLE RESUMABLE;
INSERT INTO sales_new SELECT * FROM sh.sales;
ALTER SESSION DISABLE RESUMABLE;
使用可恢复的空间分配
仅当在启用了可恢复模式的会话中执行语句时,才能使用可恢复的空间分配。有两种方法可以启用和禁用可恢复的空间分配:
• 发出ALTER SESSIONENABLE RESUMABLE命令。
• 使用ALTER SESSION或ALTER SYSTEM语句,将RESUMABLE_TIMEOUT初始化参数设置为非零值。
在为会话或数据库启用可恢复模式时,可以指定一个超时时段,在此时段后,如果未发生任何干预,则挂起的语句将出错。RESUMABLE_TIMEOUT初始化参数指示超时发生之前经过的秒数。也可以用以下命令来指定超时时段:
ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600;
TIMEOUT值一直有效,直到另一个ALTER SESSIONENABLE RESUMABLE语句更改该值,或使用另一种方式更改该值,或直到会话结束。使用ENABLERESUMABLETIMEOUT子句启用可恢复模式时的默认超时间隔是7,200 秒(2 小时)。
还可以为可恢复的语句命名。例如:
ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600
NAME 'multitab insert';
语句的名称用于在DBA_RESUMABLE和USER_RESUMABLE视图中标识可恢复的语句。
例如:
SELECT name, sql_text FROM user_resumable;
NAME SQL_TEXT
-----------------------------------------------------------
multitab insert INSERT INTO oldsales SELECT * FROMsh.sales;
要自动为各个会话配置可恢复的语句设置,可以创建并注册一个数据库级别的LOGON触发器,以更改用户的会话。此触发器可以发出命令来为会话启用可恢复的语句,指定超时时段,以及将会话发出的可恢复语句与某个名称关联。
因为挂起的语句会保留一些系统资源,所以必须先向用户授予RESUMABLE系统权限,然后他们才能启用可恢复的空间分配并执行可恢复的语句。
恢复挂起的语句
示例
1.INSERT语句遇到错误,声称表已满。
2.挂起INSERT语句,并且不向客户机传递任何错误。
3.或者,执行一个AFTER SUSPEND触发器。
4.或者,激活SQLERROR异常错误以中止语句。
5.如果语句未中止,并将空闲空间成功添加到表中,则INSERT语句将恢复执行。
检测挂起的语句
可恢复的语句挂起时,不会向客户机发出错误。为了方便采取更正措施,Oracle DBServer 提供了无需向用户通知错误,也无需提供有关情况的信息的替代方法。
在挂起期间可能执行的操作
可恢复的语句遇到可更正的错误时,系统将在内部生成AFTER SUSPEND系统事件。用户可以在数据库级别和方案级别同时为此事件注册触发器。如果用户注册一个触发器来处理此系统事件,则在SQL 语句挂起后将执行该触发器。在AFTER SUSPEND触发器内执行的SQL 语句始终不可恢复,并且始终是独立运行的。在触发器内启动的事务处理使用SYSTEM回退段。限定这些条件是为了克服死锁,并降低触发器与语句遇到相同错误条件的概率。
在触发器代码中,可以使用USER_RESUMABLE视图或DBA_RESUMABLE视图,或者使用DBMS_RESUMABLE.SPACE_ERROR_INFO函数来获得有关可恢复语句的信息。
当可恢复的语句挂起时:
• 调用语句的会话将被置于等待状态。对于EVENT列包含“statement suspended, wait error to be cleared”的会话,系统会将一个行插入V$SESSION_WAIT。
• 针对需要添加资源才能完成挂起语句的对象发出操作挂起的预警。
结束挂起的语句
解决了错误条件后(例如在DBA 干预之后,或者很可能在其它查询释放了排序空间之后),挂起的语句将自动恢复执行,并且清除“可恢复会话已挂起”预警。
可以使用DBMS_RESUMABLE.ABORT()过程强制挂起的语句激活SERVERERROR异常错误。此过程可以由DBA 调用,也可以由发出语句的用户调用。如果达到了与可恢复语句关联的挂起超时间隔,则语句将自动中止并且系统会向用户返回错误。
哪些操作是可恢复的
下列操作是可恢复的操作:
• 查询:运行时临时空间不足(排序空间不足)的SELECT语句是可恢复执行的语句。
使用OCI 时,OCIStmtExecute()和OCIStmtFetch()调用也可恢复执行。
• DML:INSERT、UPDATE和DELETE语句是可恢复执行的语句。用于执行这些语句的接口没有影响;接口可以是OCI、SQL、PL/SQL 或其它接口。此外,外部表中的INSERT INTO ...SELECT也是可恢复的。
• DDL:下列语句是可恢复执行的操作:
- CREATE TABLE ... AS SELECT
- CREATE INDEX
- ALTER INDEX ... REBUILD
- ALTER TABLE ... MOVE PARTITION
- ALTER TABLE ... SPLIT PARTITION
- ALTER INDEX ... REBUILD PARTITION
- ALTER INDEX ... SPLIT PARTITION
- CREATE MATERIALIZED VIEW
小结
• 介绍Oracle DB Server 如何自动管理空间
• 使用压缩节省空间
• 主动监视和管理表空间的空间使用量
• 介绍Oracle DB 中的段的创建
• 控制延迟创建段
• 使用“段指导”
• 使用段收缩功能从表和索引中回收浪费的空间
• 管理可恢复的空间分配

扫描二维码关注我的微学堂
搜索刘老师微信号:Rman-2014,备注“Oracle学习与咨询”,即可添加好友;或者扫描下面二维码,关注我的“微学堂”公众号,了解最新OCP认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!





