Проблема с созданием индексной организованной таблицы - PullRequest
3 голосов
/ 25 марта 2010

У меня странная проблема с индексной таблицей. Я использую стандарт 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

теперь давайте создадим другую таблицу и скопируем 2 столбца из src_table

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 мин. </p>

теперь то же упражнение, но с таблицей 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 часов !!! Я пробовал это на 2 разных экземплярах Oracle, работающих на win и linux, и получил те же результаты.

Что здесь происходит? Почему это так долго?

1 Ответ

8 голосов
/ 25 марта 2010

Подсказка APPEND полезна только для таблицы с кучей.

Когда вы вставляете в IOT, я подозреваю, что каждая строка должна быть вставлена ​​в реальную структуру индекса отдельно, что вызывает значительную перебалансировку индекса.

Когда вы строите индекс для таблицы кучи, используется временный сегмент, и я предполагаю, что это позволяет уменьшить затраты на перебалансировку, которые в противном случае имели бы место.

Я подозреваю, что если вы создали пустую, организованную в кучу таблицу с первичным ключом и сделали ту же вставку без подсказки APPEND, это заняло бы больше времени, чем 18 часов.

Вы можете попробовать добавить ORDER BY в свой SELECT и посмотреть, как это влияет на производительность вставки в IOT. Это не гарантируется каким-либо улучшением, но это может быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...