2010-03-25 47 views
3

索引組織表有一個奇怪的問題。我正在運行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 

花了甲骨文< 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; 

「插入」 到物聯網需要18小時!我已經在2個不同的運行在win和linux上的Oracle實例上進行了嘗試,結果相同。

這是怎麼回事?爲什麼需要這麼長時間?

回答

8

APPEND提示僅適用於堆組織表。

當您插入IOT時,我懷疑每行都必須分別插入真實索引結構中,導致索引重新平衡。

在堆表上建立索引時,使用了一個臨時段,我猜測這可以減少否則會發生的重新平衡開銷。

我懷疑如果你用主鍵創建了一個空的,堆組織的表,並且沒有APPEND提示做了同樣的插入,它將需要更多的18小時。

您可能會嘗試將ORDER BY放在您的SELECT上,並查看它是如何影響插入IOT的插入性能的。不能保證以任何方式進行改進,但可能會有所改進。

+1

@Dave。你是絕對正確的。在爲select語句添加order by(與IOT表的主鍵相同的順序)之後,花費2分鐘創建一個IOT表。謝謝。 – mtim 2010-03-25 20:52:24