Индексирование полей даты и времени оракула

Как мы выполняем индексацию в поле datetime в oracle. Мы должны иметь возможность искать определенный год

Спасибо

Ответ 1

Чтобы создать индекс в Oracle, используйте:

CREATE INDEX your_index_name ON your_table_name(your_column_name)

Подробнее о создании индекса Oracle читайте эту ссылку.

Коррекция и уточнение
Если вы используете функцию для выделения компонента даты (IE: EXTRACT или TRUNC), индекс в столбце не поможет. Но индекс поможет, если вы укажете диапазон дат:

WHERE your_date_column BETWEEN TO_DATE('2010-01-01', 'YYYY-MM-DD')
                                            AND TO_DATE('2010-12-31', 'YYYY-MM-DD')

Однако вы можете создавать индексы на основе функций в Oracle:

CREATE INDEX your_index_name 
    ON your_table_name(EXTRACT(YEAR FROM your_column_name))

... что администраторы баз данных ненавидят со страстью.

Ответ 2

Вы можете индексировать столбец DATE (который хранит дату и время в Oracle) напрямую:

CREATE INDEX ix ON table (column)

Oracle сможет использовать этот индекс напрямую, если вы создадите свой запрос, чтобы выполнить RANGE SCAN. Например, если вы хотите получить строки из 2010:

SELECT ...
  FROM table
 WHERE column >= DATE '2010-01-01'
   AND column < DATE '2011-01-01'

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

Ответ 3

Добавьте индекс, который не связан с столбцом, а выражение, которое извлекает год из этого столбца:

create index sample_index on YourTable (extract(year from YourDateColumn)) tablesapce YourIndexSpace;

Когда вы запрашиваете таблицу с использованием этого выражения, Oracle будет использовать индекс.

Ответ 4

Просто создайте индекс, как показано выше. НЕ ИСПОЛЬЗУЙТЕ TRUNC ФУНКЦИЯ, поскольку он игнорирует любые индексы. Например, мое поле datecreate имеет следующий формат 03.12.2009 16:55:52 Так что я использовал

trunc(datecreate, 'dd')=to_date(to_char(sysdate,'dd.mm.yyyy'),'dd.mm.yyyy')

и он работал очень медленно (около 5 секунд)!!! Теперь я использую следующее выражение:

datecreate>=to_date(to_char(sysdate,'dd.mm.yyyy'),'dd.mm.yyyy') and sw.datecreate<to_date(to_char(sysdate+1,'dd.mm.yyyy'),'dd.mm.yyyy')

и мой запрос выполняется в 0,01 sec