【问题标题】:Issue with creating index organized table创建索引组织表的问题
【发布时间】:2010-03-25 19:38:37
【问题描述】:

我在使用索引组织表时遇到了一个奇怪的问题。我正在运行 Oracle 11g 标准。

我有一个表 src_table

SQL> desc src_table;
 Name            Null?    Type
 --------------- -------- ----------------------------
 ID     NOT NULL   NUMBER(16)
 HASH       NOT NULL   NUMBER(3)
 ........

SQL> select count(*) from src_table;
  COUNT(*)
----------
  21108244

现在让我们创建另一个表并从 src_table 复制 2 列

set timing on
SQL> create table dest_table(id number(16), hash number(20), type number(1));
Table created.
Elapsed: 00:00:00.01

SQL> insert /*+ APPEND */ into dest_table (id,hash,type) select id, hash, 1 from src_table;
21108244 rows created.
Elapsed: 00:00:15.25

SQL> ALTER TABLE dest_table ADD ( CONSTRAINT dest_table_pk PRIMARY KEY (HASH, id, TYPE));
Table altered.
Elapsed: 00:01:17.35

Oracle

现在相同的练习,但使用 IOT 表

SQL> CREATE TABLE dest_table_iot (
       id     NUMBER(16) NOT NULL,
       hash  NUMBER(20) NOT NULL,
       type  NUMBER(1)  NOT NULL,
       CONSTRAINT dest_table_iot_PK PRIMARY KEY (HASH, id, TYPE)
    ) ORGANIZATION INDEX;

Table created.
Elapsed: 00:00:00.03

SQL> INSERT /*+ APPEND */ INTO dest_table_iot (HASH,id,TYPE)
    SELECT  HASH, id, 1 
    FROM src_table; 

“插入”到 IOT 需要 18 小时 !!!我已经在 win 和 linux 上运行的 2 个不同的 Oracle 实例上进行了尝试,得到了相同的结果。

这里发生了什么?为什么要花这么长时间?

【问题讨论】:

    标签: oracle


    【解决方案1】:

    APPEND 提示仅对堆组织表有用。

    当你插入到 IOT 时,我怀疑每一行都必须单独插入到真正的索引结构中,导致索引的大量重新平衡。

    当您在堆表上构建索引时,会使用临时段,我猜这可以减少否则会发生的重新平衡开销。

    我怀疑如果您使用主键创建了一个空的、堆组织的表,并且在没有 APPEND 提示的情况下执行相同的插入操作,则可能需要 18 个小时。

    您可以尝试在您的 SELECT 中添加 ORDER BY,看看它如何影响插入到 IOT 中的性能。无论如何都不能保证它是一种改进,但它可能是。

    【讨论】:

    • @Dave。你是绝对正确的。在为 select 语句添加 order by 子句后(与 IOT 表的主键顺序相同),创建 IOT 表需要 2 分钟。谢谢。
    猜你喜欢
    • 2021-12-24
    • 2020-03-24
    • 2016-12-20
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多