【问题标题】:performance tuning - Insert性能调优 - 插入
【发布时间】:2016-08-15 06:46:16
【问题描述】:

我有一个 UNIX 脚本 在此,我们使用 SQL Loader 创建表、索引并从文件加载日期到该表。 并在此表上进行近 70 次直接更新(不用于全部或批量收集)。

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

将此数据插入另一个表需要 20 分钟。如何改进?

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

insert into tables() select() from tablex; 500 000 条记录需要 20 分钟 Tablex-在同一个 shell 脚本中创建、加载、70 次直接更新。

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

insert into tables() select() from tabley; 上述语句执行不到一秒。

  • 我使用了并行提示。成本降低。 CPU 利用率为零。
  • 我应该再创建一个表 tablez 然后将数据从 tablez 加载到我的最终表吗?
  • 是否需要收集统计信息?这是每日运行程序。

【问题讨论】:

标签: database oracle performance sql-tuning query-tuning


【解决方案1】:

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

【讨论】:

  • 您好,感谢您的回复。我正在创建表,使用 SQL 加载器一次性插入,并为业务逻辑实现进行了多次更新。将此表从该表发布到另一个表。当我在这里创建表格时,我认为空块不会有任何问题。
  • 知道了。请检查以下详细信息。 1. 表 X 和表 Y 的 GB 大小是多少? 2. select from table X和table Y的explain plan有什么不同吗? 3. 如果上面的 1 和 2 相同,则检查在插入表 X 期间是否有任何其他进程正在占用 I/O 或 CPU。您可能需要使用 AWR 或 OEM 或动态性能视图来检查,如果它是这样的。希望这可以帮助。谢谢。
猜你喜欢
  • 2016-09-29
  • 2011-07-04
  • 1970-01-01
  • 2015-06-07
  • 2021-07-22
  • 2013-05-26
  • 2013-10-17
  • 2018-03-06
  • 2016-06-25
相关资源
最近更新 更多