2010-01-19 2 views
0

Может ли кто-нибудь просмотреть связанную ссылку и объяснить мне точные заявления для запуска?Создание чрезвычайно большого индекса в Oracle

Oracle DBA's Guide: Creating a Large Index

Вот что я придумал ...

CREATE TEMPORARY TABLESPACE ts_tmp 
TEMPFILE 'E:\temp01.dbf' SIZE 10000M 
REUSE AUTOEXTEND ON EXTENT MANAGEMENT LOCAL; 

ALTER USER me TEMPORARY TABLESPACE ts_tmp; 

CREATE UNIQUE INDEX big_table_idx ON big_table (record_id); 

DROP TABLESPACE ts_tmp; 

Edit 1

После этого индекс был создан, я запустил объяснить план для простого запроса и получить эта ошибка:

ORA-00959: tablespace 'TS_TMP' does not exist 

Кажется, что это совсем не временное ... :(

ответ

5
CREATE TEMPORARY TABLESPACE ts_tmp 
TEMPFILE 'E:\temp01.dbf' SIZE 10000M 
REUSE AUTOEXTEND ON EXTENT MANAGEMENT LOCAL; 

Это создает временное табличное пространство (область на диске, где будут сохранены промежуточные результаты сортировки). Индекс представляет собой отсортированный набор данных, и сортировка требует большого количества пространства.

«Временное» означает, что хранящиеся данные являются временными по своей природе, а не тем, что пространство таблиц является временным. Подумайте об этом как /tmp в Unix или %TEMP%, сложенном в Windows: сам каталог/папка является постоянным, но хранящиеся в нем данные являются временными.

REUSE означает, что файл не существует, если файл уже существует (обычно используется, когда имя файла указывает на необработанное устройство, например, неформатированный раздел диска, чтобы избежать накладных расходов на управление файлами) OS. Вместо этого он просто откроет файл для записи и заполнит его новыми данными. Если не для этого предложения, команда будет терпеть неудачу, если файл с указанным именем существует.

AUTOEXTEND ON означает «при необходимости произрасти файл». Если вы отключите его и 10Gb будет недостаточно для операции сортировки, табличное пространство не будет автоматически расти, и операция завершится неудачно.

EXTENT MANAGEMENT LOCAL означает, что расположение табличного пространства сохраняется в самом табличном пространстве (не в системных таблицах). Не уверен насчет 11g, но в предыдущих версиях Oracle этот параметр не был доступен для временных табличных пространств.

ALTER USER me TEMPORARY TABLESPACE ts_tmp; 

Это делает пользователь me использовать вновь созданную временную табличную в качестве временной среды хранения

CREATE UNIQUE INDEX big_table_idx ON big_table (record_id); 

Это просто создает индекс.

DROP TABLESPACE ts_tmp; 

Это отбрасывает временное табличное пространство.

Перед запуском скрипта, выяснить текущее табличного значения по умолчанию:

SELECT temporary_tablespace 
FROM dba_users 
WHERE username = 'ME' 

Скорее всего, это будет возвращать TEMP.

Перед отбрасыванием ts_tmp, восстановить временный по умолчанию табличного пространства для пользователя:

ALTER USER me TEMPORARY TABLESPACE temp; -- or whatever the previous query returned. 
+0

Спасибо, но ... Не могли бы вы взглянуть на ссылку руководства DBA и посмотреть, правильно ли я ее реализовал? Я надеялся, что объясню исходный материал, а не то, что я написал. – Rudiger

+0

'@ Rudiger': в основном, все это просто гарантирует, что у вас будет достаточно места на диске для создания индекса. Да, вы внедрили это правильно, за исключением предложения 'EXTENT MANAGEMENT', о котором я не уверен. Если код не вызывает ошибок, то это нормально. Единственное, что вы пропустили, это то, что вам нужно будет вернуть табличное пространство пользователя по умолчанию до предыдущего значения, прежде чем вы уроните вновь созданный. – Quassnoi

+0

Что такое инструкция 'ALTER USER', которая возвращает мое временное табличное пространство в исходное временное табличное пространство? – Rudiger

0

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

+2

Табличное пространство можно уменьшить вручную с ограничением, которое вы не можете сжать, чтобы оно «кончилось» перед использованием блока. То есть у вас есть файл с 1000 блоками, с данными только между блоками 700 и 750. Вы можете сжать его до 751 блока, но не до 51 блока. –

0

В HWM (половодье марк) увеличивается, что в зависимости от того, как подсчитывать использование появляется полным - для просмотра надлежащего использования ВРЕМЕННЫХ табличных используйте представления V $ SORT_USAGE и V $ SORT_SEGMENT.

Смежные вопросы