我正在製作應用程序,將1500萬條記錄放入表格中,然後建立一個索引。它大約需要。 30分鐘創建索引(使用索引優化提示,例如NOLOGGING)。我可以選擇插入按相同列排序的數據,我將在後面構建索引。從訂購數據構建Oracle索引
我會這樣做嗎?
我是開發人員,而不是DBA,所以請原諒,如果這是一個明顯的答案。
我正在製作應用程序,將1500萬條記錄放入表格中,然後建立一個索引。它大約需要。 30分鐘創建索引(使用索引優化提示,例如NOLOGGING)。我可以選擇插入按相同列排序的數據,我將在後面構建索引。從訂購數據構建Oracle索引
我會這樣做嗎?
我是開發人員,而不是DBA,所以請原諒,如果這是一個明顯的答案。
如果您已經對數據進行了排序,那麼當您創建索引時,可以告訴Oracle它不需要使用NOSORT關鍵字對數據重新排序。
CREATE INDEX index_name ON table_name (col1, col2) NOSORT;
SORT | NOSORT默認情況下,Oracle數據庫在創建索引時按升序排列索引 。您可以指定NOSORT向 數據庫指示行已按 升序排列存儲在數據庫中,以便Oracle數據庫在創建索引時不必對 行進行排序。如果索引列或 列的行未按升序存儲,那麼數據庫將返回 錯誤。爲了最大限度地節省排序時間和空間,請在將行初始加載到表中後立即使用本條款 。如果你 既不指定這些關鍵字,那麼SORT就是默認值。
我也不是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子句的任何更改,有序數據更快。
這樣做可能不會獲得任何整體表現。
您將失去更多時間對錶格數據進行排序,而不是您從構建索引獲得的時間。 (雖然如果您構建多個索引,情況可能會有所不同)。
排序表需要與整個表的大小一樣多的內存或臨時表空間。我不確定索引構建的內部結構,但我猜測Oracle只會對(小得多的)相關數據進行排序。
由於您正在使用多列,因此您可能需要查看索引壓縮。根據您的數據和列順序,它可以爲您在初始構建中節省大量時間和空間。
我不在oracle中排序數據。我的問題是,如果我通過以已排序的順序輸入記錄而獲益。指數的構建會更快嗎? – Jeffrey 2012-03-07 14:27:00
但是,有些系統不需要爲這種排序付出代價嗎?如果沒有,那麼你也可以對它進行分類。對錶格數據排序也會降低聚類因子,這可能會使索引更有效地使用。如果您使用表格數據,排序表格數據也可以幫助您進行表格壓縮。 – 2012-03-08 00:04:46