Как мы выполняем индексацию в поле datetime в oracle. Мы должны иметь возможность искать определенный год
Спасибо
Как мы выполняем индексацию в поле datetime в oracle. Мы должны иметь возможность искать определенный год
Спасибо
Чтобы создать индекс в 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))
... что администраторы баз данных ненавидят со страстью.
Вы можете индексировать столбец 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'
Этот индекс также может использоваться для ответа на запросы в течение определенного месяца, дня или любого другого диапазона.
Добавьте индекс, который не связан с столбцом, а выражение, которое извлекает год из этого столбца:
create index sample_index on YourTable (extract(year from YourDateColumn)) tablesapce YourIndexSpace;
Когда вы запрашиваете таблицу с использованием этого выражения, Oracle будет использовать индекс.
Просто создайте индекс, как показано выше. НЕ ИСПОЛЬЗУЙТЕ 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