gpt4 book ai didi

oracle - 创建索引组织表的问题

转载 作者:行者123 更新时间:2023-12-01 09:39:22 25 4
gpt4 key购买 nike

我在使用索引组织表时遇到了一个奇怪的问题。我正在运行 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 < 2 分钟。

现在相同的练习,但使用 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 实例上进行了尝试,得到了相同的结果。

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

最佳答案

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

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

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

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

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

关于oracle - 创建索引组织表的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2518787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com