2012-03-06 47 views
2

我正在製作應用程序,將1500萬條記錄放入表格中,然後建立一個索引。它大約需要。 30分鐘創建索引(使用索引優化提示,例如NOLOGGING)。我可以選擇插入按相同列排序的數據,我將在後面構建索引。從訂購數據構建Oracle索引

我會這樣做嗎?

我是開發人員,而不是DBA,所以請原諒,如果這是一個明顯的答案。

回答

6

如果您已經對數據進行了排序,那麼當您創建索引時,可以告訴Oracle它不需要使用NOSORT關鍵字對數據重新排序。

CREATE INDEX index_name ON table_name (col1, col2) NOSORT; 

SORT | NOSORT默認情況下,Oracle數據庫在創建索引時按升序排列索引 。您可以指定NOSORT向 數據庫指示行已按 升序排列存儲在數據庫中,以便Oracle數據庫在創建索引時不必對 行進行排序。如果索引列或 列的行未按升序存儲,那麼數據庫將返回 錯誤。爲了最大限度地節省排序時間和空間,請在將行初始加載到表中後立即使用本條款 。如果你 既不指定這些關鍵字,那麼SORT就是默認值。

1

我也不是DBA,但我很好奇並且做了測試(如果有人認爲我的測試無效,請讓我知道)。

我創建表

CREATE TABLE TEMP (
    ID_TEMP NUMBER(10) NOT NULL, 
    SOME_DATE DATE NOT NULL, 
    SOME_TEXT VARCHAR2(60) NOT NULL, 

    CONSTRAINT TEMP_PK primary key (ID_TEMP) 

); 

然後填充具有隨機值

declare 
    vdate date; 
begin 
    for idx in 0..10000000 loop 
    vdate := sysdate - dbms_random.value(0,102548); 
    insert into temp values(idx, vdate, 'something'); 
    end loop; 
    commit; 
end; 

之後,該指數:

create index TEMP_DATE_NDX ON TEMP (SOME_DATE) NOLOGGING; 
-- index TEMP_DATE_NDX created. Elapsed: 00:00:24.650 

然後我DROP掉該表並重新創建,但這次我按順序插入記錄:

DROP TABLE TEMP; 
-- create table omitted... 
declare 
    vdate date; 
begin 
    for idx in 0..10000000 loop 
    vdate := trunc(sysdate) + idx; 
    insert into temp values(idx, vdate, 'something'); 
    end loop; 
    commit; 
end; 

create index TEMP_DATE_NDX ON TEMP (SOME_DATE) NOLOGGING; 
-- index TEMP_DATE_NDX created. Elapsed: 00:00:01.993 

正如您所看到的,隨着create index子句的任何更改,有序數據更快。

0

這樣做可能不會獲得任何整體表現。

您將失去更多時間對錶格數據進行排序,而不是您從構建索引獲得的時間。 (雖然如果您構建多個索引,情況可能會有所不同)。

排序表需要與整個表的大小一樣多的內存或臨時表空間。我不確定索引構建的內部結構,但我猜測Oracle只會對(小得多的)相關數據進行排序。

由於您正在使用多列,因此您可能需要查看索引壓縮。根據您的數據和列順序,它可以爲您在初始構建中節省大量時間和空間。

+0

我不在oracle中排序數據。我的問題是,如果我通過以已排序的順序輸入記錄而獲益。指數的構建會更快嗎? – Jeffrey 2012-03-07 14:27:00

+0

但是,有些系統不需要爲這種排序付出代價嗎?如果沒有,那麼你也可以對它進行分類。對錶格數據排序也會降低聚類因子,這可能會使索引更有效地使用。如果您使用表格數據,排序表格數據也可以幫助您進行表格壓縮。 – 2012-03-08 00:04:46