2016-04-21 42 views
-3

我有一个UNIX脚本 在此我们创建表,索引和使用SQL Loader从文件加载到此表的日期。 并在此表上进行近70次直接更新(并非全部使用或批量收集)。性能调整 - 插入

最后我们将这个新表格数据插入到另一个表格中。每天它处理500 000条记录。所有这些更新都非常快。

将此数据插入另一个表格需要20分钟。这怎么能改进?

  1. 插入没有问题,因为在同一张表上,我们从另一个表格中插入500 000个rectors,这个表格工作正常。插入完成不到一分钟。

插入到表中()select()from tablex; 对于500 000条记录需要20分钟 Tablex-在同一个shell脚本中完成,创建,加载,70个直接更新。

检查单独选择的解释计划成本和与插入脚本都相同。

插入到table()select()from tabley; 上述语句执行时间不到一秒钟。

  • 我用平行提示。成本降低。而且CPU利用率为零。
  • 我应该创建一个表tablez然后将tablez中的数据加载到我的最终表中吗?
  • 统计信息收集是必需的吗?这是每日运行程序。
+1

步骤#1 - 阅读[问]。 – OldProgrammer

回答

0

当我们使用SQL Loader进行直接路径插入时,记录被插入到HighWaterMark之上。加载完成后,HighWaterMark向上移动,可能会在原/旧HighWaterMark位置下方出现大量空白块。如果您的SELECT将用于全表扫描,它也将读取所有这些空白块。检查你的表是否在一段时间内积累了大量的空块。您可以为此使用Segment Advisor。根据顾问的建议,缩小桌子并释放未使用的空间。这可以加快执行速度。希望这可以帮助。

+0

嗨,感谢您的回复。 Im创建表,使用SQL Loader一次性插入以及用于业务逻辑实现的许多更新。将此表从此表中发布到另一个表。正如我在这里创建表,我认为这不会是空块的任何问题。 – VIDHYA

+0

明白了。请检查下面的细节。 1. GB中表X和表Y的大小是多少? 2.从表X和表Y中选择的解释计划有任何不同吗? 3.如果上面的1和2是相同的,那么在插入表X的过程中检查是否有任何其他进程正在耗尽I/O或CPU。您可能想要使用AWR或OEM或动态性能视图来检查它是如此。 希望这会有所帮助。谢谢。 – ArtBajji