Оракул, индексирование поля даты и времени - PullRequest
10 голосов
/ 18 мая 2010

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

Спасибо

Ответы [ 4 ]

8 голосов
/ 18 мая 2010

Чтобы создать индекс в 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))

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

3 голосов
/ 18 мая 2010

Вы можете индексировать столбец 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'

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

0 голосов
/ 19 апреля 2013

Просто создайте индекс, как показано выше. НЕ ИСПОЛЬЗОВАТЬ TRUNC FUNCTION , поскольку оно игнорирует любые индексы Например, мое поле 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

0 голосов
/ 18 мая 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...