Oracle 11g: Индекс не используется в « выберите отдельный »-запрос

Мой вопрос касается Oracle 11g и использования индексов в SQL-запросах.

В моей базе данных есть таблица со следующей структурой:

Table tab (
  rowid NUMBER(11),
  unique_id_string VARCHAR2(2000),
  year NUMBER(4),
  dynamic_col_1 NUMBER(11),
  dynamic_col_1_text NVARCHAR2(2000)
 ) TABLESPACE tabspace_data;

Я создал два индекса:

CREATE INDEX Index_dyn_col1 ON tab (dynamic_col_1, dynamic_col_1_text) TABLESPACE tabspace_index;
CREATE INDEX Index_unique_id_year ON tab (unique_id_string, year) TABLESPACE tabspace_index;

Таблица содержит от 1 до 2 миллионов записей. Я извлекаю из него данные, выполняя следующую команду SQL:

SELECT distinct
 "sub_select"."dynamic_col_1" "AS_dynamic_col_1","sub_select"."dynamic_col_1_text" "AS_dynamic_col_1_text"
FROM 
(
    SELECT "tab".*  FROM "tab"
    where "tab".year = 2011
) "sub_select"

К сожалению, для выполнения запроса требуется около 1 часа, хотя я создал оба описанных выше индекса. План объяснения показывает, что Oracle использует " Полный доступ к таблице », то есть полное сканирование таблицы. Почему не используется индекс?

В качестве эксперимента я протестировал следующую команду SQL:

SELECT DISTINCT
 "dynamic_col_1" "AS_dynamic_col_1", "dynamic_col_1_text" "AS_dynamic_col_1_text"
 FROM "tab"

Даже в этом случае индекс не используется и выполняется полное сканирование таблицы.

В моей реальной базе данных таблица содержит больше проиндексированных столбцов, таких как «dynamic_col_1» и «dynamic_col_1_text». Весь индексный файл имеет размер около 50 ГБ.

Еще несколько сведений:

  • База данных - это Oracle 11g, установленная на моем локальном компьютере.
  • Я использую 64-битную Windows 7 Enterprise.
  • Весь индекс разбит на 3 файла dbf размером около 50 ГБ.

Я был бы очень рад, если бы кто-нибудь мог сказать мне, как заставить Oracle использовать индекс в первом запросе. Поскольку первый запрос используется другой программой для извлечения данных из базы данных, он может вряд ли можно изменить. Так что вместо этого было бы хорошо настроить таблицу.

Заранее спасибо.

[01.10.2011: ОБНОВЛЕНИЕ]

Думаю, я нашел решение проблемы. Оба столбца dynamic_col_1 и dynamic_col_1_text допускают значение NULL.После изменения таблицы, запрещающей значения "NULL" в обоих столбцах, и добавления нового индекса только для столбца год , Oracle выполняет быстрое сканирование индекса. Преимущество состоит в том, что запрос принимает теперь около 5 секунд для выполнения, а не 1 час, как раньше.

7
задан oracle_user54 1 October 2011 в 11:33
поделиться