Индексирование полей даты и времени оракула
Как мы выполняем индексацию в поле 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