Если вы делаете сравнение, вы не должны конвертировать дату в строку.Вы должны сравнивать с другой датой.В противном случае Oracle не сможет использовать нефункциональный индекс в столбце даты.
В общем, то есть вам лучше кодировать
WHERE some_indexed_date_column = to_date( :string_bind_variable,
<<format mask>> )
, а не
WHERE to_char( some_indexed_date_column,
<<format mask>> ) = :string_bind_variable
Конечно, если ваша переменная связывания может быть DATE
, а не VARCHAR2
, это даже лучше, потому что тогда вам не нужно выполнять какое-либо преобразование типов данных, и оптимизатору будет намного проще оценить количество элементов.
Если вы пытаетесь сделать некоторыеманипулирование датой - например, если вы хотите сравнить часть дня, опуская часть времени даты - вы можете использовать индексы на основе функций.Например, если вы хотите найти все строки, которые были созданы сегодня,
WHERE trunc( some_date_column ) = date '2011-11-04'
, вы можете создать индекс на основе функций для столбца даты
CREATE INDEX idx_trunc_dt
ON table_name( trunc( some_date_column ) )
илиможет переписать запрос, чтобы сделать что-то вроде
WHERE some_date_column >= date '2011-11-04'
AND some_date_column < date '2011-11-05'