Oracle database. Какой выбор оптимальнее?
Есть таблица. Предполагается наличие уникальной записи по выборке(см. ниже). Цель - извлечь данные за минимальное время. FETCH FIRST добирается до первой соответствующей записи и возвращает результат? или в любом случае проходит по всей таблице и возвращает указанное количество строк(может, еще и сортирует)? Что будет работать быстрее? На каких условиях? Есть ли в диалекте oracle команда, чтобы вытаскивать первую попавшуюся запись без прохода по всей таблице?
SELECT * FROM SOME_TABLE WHERE FIRST_ID IS NULL AND SECOND_ID=200 AND THIRD_ID=300
или
SELECT * FROM SOME_TABLE WHERE FIRST_ID IS NULL AND SECOND_ID=200 AND THIRD_ID=300 FETCH FIRST 1 ROWS ONLY
Ответы (1 шт):
Какой выбор оптимальнее?
Этот выбор делает оптимизатор запросов. Он может составить несколько планов выполнения, сравнить их предпологаемые затраты и выбрать оптимальный.
При составлени запроса в первую очередь следует уделить внимание тому, чтобы он соответствовал условию задачи. Так как, условие задачи в вопросе: Предполагается наличие уникальной записи по выборке, а оба запроса из вопроса выполняют разные задачи, то и сравнивать их эффективность бесполезно.
Первый запрос предпологает наличие уникального индекса по всем условиям выборки, то есть:
create table t1 (id1 int, id2 int, id3 int, constraint uqt1 unique (id1,id2,id3));
В этом случае, будет читаться индекс - обычно не более 3-4 блоков, по найденной записи в индексе прочтётся один блок таблицы. На этом поиск записи закончится.
Во втором запросе по видимому, идет поиск одной записи без уникального индекса (иначе FETCH FIRST не имеет смысла). В этом случае, сканирование таблицы (или диапазона нормального индекса при его наличии) будет продолжатся до того, пока первая запись, удовлетворяющая условию выборки, не будет найдена. На этом дальнейшее сканирование будет прервано.