【问题标题】:How to speed up PK and index creation on Oracle如何在 Oracle 上加快 PK 和索引创建
【发布时间】:2013-08-08 07:32:52
【问题描述】:

在 880 个 mio 行上创建 PK 和索引大约需要 1:15 小时。

查询:

 alter table STG.NOTES add constraint PK_NOTES primary key (NOTES_SK);
 create unique index STG.BK_NOTES on STG.NOTES (NOTE_NBR ASC);

有没有办法加快速度?我阅读了并行和无日志记录选项。 Oracle 服务器有 2 个 CPU,因此并行 (n-1 = 2-1 = 1) 无济于事。只留下nologging。你能告诉我什么吗?什么是权衡?为什么会/不会使用它?

编辑: 或许我还需要解释一下索引创建的上下文是什么:

  1. 截断目标表,然后删除目标表上的 PK 和索引

  2. 从源中选择并批量插入到目标中

  3. 在目标表上创建索引和 PK(= 1:15 小时)

【问题讨论】:

  • 您是否尝试过在加载数据时保留索引?虽然这会使插入花费更长的时间,但总体上可能比删除、插入和重新创建更快。

标签: sql oracle indexing


【解决方案1】:

实际上,您可以在具有 2 个内核的 PC 上使用更高程度的并行性。检查parallel_max_servers 以获取数据库中的默认设置。

show parameter parallel_max_servers

要并行执行,您可以使用

alter session force parllel ddl parallel 4

除了协调器之外,还将创建 8 个从属服务器。

关于nologging,我觉得是个不错的选择。使用nologging 意味着在发生灾难时您必须重新创建索引。如果索引创建过程是例行公事,可以考虑。

【讨论】:

  • 显示参数parallel_max_servers >显示参数查询失败,知道吗?可能缺少读取参数的权限?
  • 可能是。无论如何尝试并行执行。您可以阅读here 关于默认限制的信息。 4级应该没问题。
  • @BaseBallBatBoy 如果您不知道,show parameter ... 只能在 SQL*Plus 中工作。在大多数其他环境中,您需要运行类似select value from v$parameter where name = 'parallel_max_servers'; 的东西。另外,我同意 haki,尝试并行构建它。关于并行度有很多误解,您一定要亲自尝试一下。
【解决方案2】:

NOSORT 如果NOTE_NBR 已经订购,您可以节省时间 通过不对数据进行排序。如果 NOTE_NBR 是从单线程序列创建的或者如果您的查询是有序的,这可能是正确的。

不要重新收集索引统计信息 创建或重建索引会自动创建索引统计信息。如果你重新收集统计数据 表,cascade=>false 可以节省一些时间。默认选项,cascade=>dbms_stats.auto_cascadedoes not really work

【讨论】:

    猜你喜欢
    • 2021-04-05
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多