分类: Oracle
2008-04-15 13:37:06
来源:赛迪网技术社区 作者:yuanshang |
请注意,在使用并行INSERT方法时,你需要首先利用ALTER SESSION ENABLE PARALLEL DML命令为会话期来启动并行DML。
如果输入数据位于一个平面文件中,那么你也可以使用一个外部表,然后将这些数据插入到一个压缩表中,就像这些数据放在一个登台表中可用一样。(对外部表的讨论超出了本文的范围)。
你还可以使用CREATE TABLE ... AS SELECT语句一次生成一个压缩表,并将数据插入至其中。 这里有一个例子:
如果你没有使用正确的加载或INSERT方法,那么即使使用COMPRESS对表格进行了定义,该表中的数据也将仍然保持未压缩状态。 例如,如果你使用惯用路径SQL*Loader或正则INSERT语句,那么数据仍然是未压缩的。
什么时候使用表压缩
Oracle数据库选择用来压缩表数据或不压缩表数据的方式已暗中牵涉到了最适合于表压缩的应用程序。如上所述,一个表中已被使用COMPRESS定义的数据,只有在使用直接路径模式被加载或利用添加(append)或并行模式被插入时,才会得到压缩。通过正则插入语句插入的数据将保持未压缩状态。
在在线事务处理(OLTP)系统中,通常是使用正则插入模式来插入数据的。因此,使用表压缩通常不会使这些表格获得太大的好处。 表压缩对于那些只加载一次但多次读取的只读表格具有最佳效果。例如,数据仓库应用程序中所用的表格特别适合于进行表压缩。
此外,在一个已压缩表中更新数据可能要求数据行为非压缩的,这样就达不到进行压缩的目的。因此,那些需要经常进行更新操作的表不适于进行表压缩。
最后,让我们来看一下行删除对表压缩应用的影响。当你删除一个压缩的表中的一行时,数据库将释放该行在数据库数据块中所占据的空间。 这一自由空间可以由未来插入的数据重新使用。但是,由于以惯用模式插入的行不能被压缩,所以它不太可能适合放在一个被压缩的行所释放的空间。大量的相继的DELETE与INSERT语句可能会导致磁盘碎片,且所浪费的空间甚至会多于使用压缩所能节省的空间。
压缩一个已有的未压缩表
如果你有一个已有的未压缩表,那么你可以利用ALTER... MOVE语句对其进行压缩。例如,可以利用以下方法对一个名为SALES_HISTORY_TEMP的未压缩表进行压缩:
你也可以将ALTER TABLE ...MOVE语句用于解压缩一个表,如下例所示:
请注意,ALTER TABLE ...MOVE操作会获得一个对该表操作的EXCLUSIVE锁,它可以在该语句执行过程中禁止对该表进行任何DML操作。你可以利用Oracle9i数据库的在线表重定义特性来避免这一可能出现的问题。
压缩一个物化视图
你可以使用用于压缩表的类似方式来压缩物化视图。下面的命令生成一个压缩的物化视图:
基于多个表的联接生成的物化视图通常很适于压缩,因为它们通常拥有大量的重复数据项。你可以使用ALTER MATERIALIZED VIEW命令来改变一个物化视图的压缩属性。下面的命令显示了如何压缩一个已有的未压缩的物化视图。
当你使用此命令时,请注意通常是在下一次刷新该物化视图时才会进行实际的压缩。 |