删除所有行并在Oracle中插入可以使性能更差?

时间:2014-03-31 15:15:06

标签: oracle

我在一个项目中工作,我需要定期(每4个月)从excel文件进​​行一次批量更新。这些excel文件中没有密钥。

开发删除所有行并再次插入整个数据库的代码比检查每一行及其主键(有时可以是5列键)的代码更容易。

我的问题是: 如果删除表的所有行并再次插入它,如果它将导致表空间碎片,并在将来导致执行丢失。

提前致谢

亚历山大

1 个答案:

答案 0 :(得分:1)

假设您可以在重新加载表时停止数据库上的所有其他活动,处理它的最佳方法是

truncate table my_table drop storage;
insert ...

然后是您的插入。这将有效地消除表行上的每种结构,并重新构建表。正如Alex Poole所说,truncate table也会进行提交,因此您的应用程序在重建时不会看到数据。

如果您在更新期间无法关闭应用程序,可以尝试

delete from table
insert  ...
commit work;

在一个大事务中(确保关闭自动提交,具体取决于您用于插入的脚本/语言类型)。在您提交之前,这不会让您的客户端看到任何更改,并确保新行插入“新空间”,因为在您提交之前,oracle无法删除原始行。这也意味着您需要在桌面上占用一倍的空间,并且根据数据的大小,也可能会填充您的重做日志。

与在删除和插入之间切换时相比,这两种方法都会产生更少的碎片。 (在某些情况下,根本不会出现碎片;例如,如果您没有任何varchars或其他具有非常量长度的数据类型,则每行将占用相同的空间量。方案,删除和插入之间的交替甚至可能更好,因为每个删除的行可以一次重复使用。)

在填写表格之后,您应该做的是重建索引统计信息。优化程序使用它们来选择连接表的顺序,如果它们出错,您的查询可能会慢慢。在旧版本的oracle中,你可以使用

之一
analyze index i1 estimate statistics
analyze index i1 compute statistics

前者更快,后者更彻底。在较新版本的oracle中,这些命令仍然有效,但dbms_package中有更快的版本可以并行工作。查看documentation以获取更多信息,尤其是GATHER _ * _ STATS程序。