使用正确的并行度是最重要的。NOLOGGING也将在最后的块加载阶段提供帮助。最后,你应该确保你有大量的PGA可用,这样你就不会做多遍排序。检查v$pgastat中的' global memory bound ',如果它小于1G(最大值),则提升pga_aggregate_target,直到全局内存限制达到1G。或者,您可以启用手动PGA并将sort_area_size设置为最大值:
ALTER SESSION SET workarea_size_policy=manual;
ALTER SESSION SET sort_area_size=1073741823;
除了并行性和nlogging之外,这些功能还可以缩短索引创建时间: 1.压缩-压缩占用额外的CPU时间,但使用较少的I/O。在某些情况下,这个选项 * 可能 * 保存时间,比如如果你有一个高度可压缩的多列索引。 1.NOSORT-如果行碰巧是按顺序插入的,例如您刚刚加载了预排序的数据,则NOSORT选项可以保存大量时间。 1.不重新收集统计信息-统计信息是在建立索引时自动收集的,因此不要在建立索引后手动收集索引统计信息。如果要收集表统计信息,请使用参数cascade => false来防止重新收集索引统计信息。 我同意Paul W的观点,获得正确的并行度可能是最重要的因素。如果你想优化这个语句,并且不关心同时运行的其他任何东西的性能,crank the DOP as high as possible。 但是我对使用分区来加速索引创建持怀疑态度。因为排序是O(n*log(n)),所以对一个大集合排序通常比对多个小集合排序更快。
2条答案
按热度按时间vkc1a9a21#
使用正确的并行度是最重要的。
NOLOGGING
也将在最后的块加载阶段提供帮助。最后,你应该确保你有大量的PGA可用,这样你就不会做多遍排序。检查v$pgastat
中的'global memory bound
',如果它小于1G(最大值),则提升pga_aggregate_target
,直到全局内存限制达到1G。或者,您可以启用手动PGA并将sort_area_size
设置为最大值:现在你的每个PX线程将获得1G的PGA分配。只要确保主机上有足够的可用内存即可。因为它被分配给每个PX线程,所以提高DOP可以增加在内存中而不是在磁盘上完成的工作量,此外还可以在构建中分配更多的工作线程。您不太希望完全在内存中处理50亿条记录,但至少可以在溢出到临时工作区之前尽可能地优化PGA的使用。
oprakyz72#
除了并行性和nlogging之外,这些功能还可以缩短索引创建时间:
1.压缩-压缩占用额外的CPU时间,但使用较少的I/O。在某些情况下,这个选项 * 可能 * 保存时间,比如如果你有一个高度可压缩的多列索引。
1.NOSORT-如果行碰巧是按顺序插入的,例如您刚刚加载了预排序的数据,则
NOSORT
选项可以保存大量时间。1.不重新收集统计信息-统计信息是在建立索引时自动收集的,因此不要在建立索引后手动收集索引统计信息。如果要收集表统计信息,请使用参数
cascade => false
来防止重新收集索引统计信息。我同意Paul W的观点,获得正确的并行度可能是最重要的因素。如果你想优化这个语句,并且不关心同时运行的其他任何东西的性能,crank the DOP as high as possible。
但是我对使用分区来加速索引创建持怀疑态度。因为排序是O(n*log(n)),所以对一个大集合排序通常比对多个小集合排序更快。