分类: Oracle
2008-04-15 13:37:26
来源:赛迪网技术社区 作者:yuanshang |
压缩一个已分区的表
在对已分区的表应用压缩时,可以有很多种选择。你可以在表级别上应用压缩,也可以在分区级别上应用压缩。例如,代码清单 1中的CREATE TABLE语句创建一个具有4个分区的表。 由于是在表级别指定了COMPRESS,所以对全部4个分区都进行压缩。
由于可以在分区级别上指定压缩属性,所以你可以选择压缩某些分区,而使另一些分区保持未压缩状态。代码清单 2中的示例说明了如何在分区级别上指定压缩属性。
在代码清单 2中,压缩了两个表分区(SALES_Q1_03和SALES_Q2_03) ,而另外两个分区未被压缩。要注意,在分区级别上指定的压缩属性会取代对该分区在表级别上特定的压缩属性。如果未为一个分区指定压缩属性,那么该分区将继承在表级别上指定的压缩属性。在代码清单 2中,由于未对分区SALES_Q3_03和SALES_Q4_03指定压缩属性,所以这两个分区继承表级别上指定的属性值(在本例情况下为默认的NOCOMPRESS)。
在通过压缩来使用已分区的表时,它可以提供一个独特的好处。对表进行分区的一个非常有用的方法是将要对其进行DML操作(插入、更新与删除)的数据放入与只读文件分开的分区内。例如,在代码清单 2的表定义中,根据SALE_DATE对销售数据进行了分区,这样可将每一季度的销售历史数据存储在一个单独的分区内。在此示例中,2003年第1、2季度的销售数据不能被修改,所以将它们置于压缩分区SALES_Q1_03 和SALES_Q2_03中。对于第3、4季度的销售数据仍可以进行修改,所以相应的分区SALES_Q3_03和SALES_Q4_03保持未压缩状态。
如果在2003年第3季度末,SALES_Q3_03分区中的数据变为只读的,那么你可以利用ALTER TABLE ...MOVE PARTITION命令对此分区进行压缩,如下面的语句所示:
要找出一个表中的哪些分区被压缩了,可以查询数据字典视图USER_TAB_PARTITIONS,如下例所示:
定量地评价压缩带来的好处
使用表压缩的最主要原因是要节省存储空间。压缩形式的表所占用的空间通常小于其非压缩形式所占用的空间。为了说明这一点,可考虑以下测试,其中有两个表--一个是未压缩的(SALES_HISTORY),一个是压缩的(SALES_HISTORY_COMP)。这两个表都是利用直接路径SQL*Loader由一个包含有200万行的单一平面文件加载的。在完成了对两个表的数据加载后,压缩的表所占用的空间差不多是未压缩表的一半。代码清单 3显示了分析结果。
一个压缩的表可以存储在更少的数据块中,从而节省了储存空间,而使用更少的数据块也意味着性能的提高。 在一个I/O受到一定限制的环境中对一个压缩的表进行查询通常可以更快速地完成,因为他们需要阅读的数据库数据块要少得多。为了说明这一点,我对一个压缩的表和一个未压缩的表进行查询,并执行一个SQLTRACE/TKPROF分析。代码清单 4显示了该分析结果。
SQLTRACE/TKPROF报告表明:我对该压缩表执行的物理和逻辑I/O操作相对于对非压缩表进行的相应查询要少得多,因而执行得也更快得多。
性能开销
由于表压缩是在批量加载时进行的,所以数据加载操作会因涉及附加的内务操作而需要额外的处理工作。为了衡量压缩对性能的影响,我进行了一个测试,在该测试中,我向两个相同的表中(一个压缩的表,另一个未压缩的表)加载了(利用直接路径SQL*Loader)100万行数据。表 1显示了由SQL*Loader日志文件中取出的结果,它们给出了向这两个压缩的与非压缩的表中加载数据花费了多少时间。加载压缩的表所需要的额外时间源自在数据加载过程中所执行的压缩操作。在实际情况下,实际时间差取决于表的设计与给定环境下的数据的布局。
结论
Oracle9i第2版中的表压缩特性可以节省大量的磁盘空间,尤其是对于具有大型只读表的数据库来说更是如此。如果你能记住加载和插入需要,并能确定那些适于进行压缩的表,那么你会发现,表压缩是节省磁盘空间的绝佳方式,在某些情况下还可以提高查询性能。 |