2013-04-14 3 views
0

Я хотел бы получить строку с минимальным значением столбца myDate. Для этого я использую следующий запрос:Сложность времени для получения строки с максимальным значением в Oracle

select * from (select * from table where processed = 'N' 
order by myDate) 
where rownum = 1; 

Можно ли создать индекс (ы), который сделает этот запрос, чтобы быть O (1) временная сложность в Oracle: просто выбрать первую строку из не обрабатывается строки с минимальной датой (что-то вроде индекса btree, разделенного на две части, поскольку столбец processed может иметь только значения «Y» или «N»).

ответ

2

Да, с индексом on (myDate, обработанным), вы сможете получить одну строку напрямую. Не O (1) (btree этого не предлагает), но намного лучше, чем O (n) полного сканирования таблицы.

Порядок столбцов в этом индексе важен. Обычно вы хотите, чтобы это было сначала заказано myDate, и внутри этого переключателя этим флагом (но см. Ниже).

Также обратите внимание, что если у «первых» (заказанных myDate) тысяч записей все есть processed=Y, сканирование индекса по-прежнему займет (небольшое) время, чтобы пропустить все это (в индексе, а не в таблице). Наихудший случай по-прежнему будет O (n), если это относится к всем записей (тогда это будет полное сканирование индекса).

Если это окажется проблемой, вы можете переключить порядок столбцов индекса (обработанный, myDate). Тогда у вас будет фактически два индекса B-дерева, один для Y и один для N.

Смежные вопросы