При каких условиях делает ROWNUM=1, значительно увеличивают производительность в “существовании” syle запрос

Кроме того, никогда не забывайте, что идентификатор уникален. После того, как используемый, Значение идентификатора не может появиться снова нигде в документе.

у Вас могут быть многие идентификатор, но у всех должно быть уникальное значение.

, С другой стороны, существует элемент класса. Точно так же, как идентификатор это может много раз появляться, но значение может использоваться много раз.

5
задан Community 23 May 2017 в 12:26
поделиться

5 ответов

Он действительно значительно улучшает производительность (в среднем на десятки процентов) по запросам, которые не могут быть решены простым поиском по одному индексу, например, при объединении таблиц. Однако он может скрыть ошибку данных / приложения.

Давайте составим таблицу:

create table t (id number(10,0), padding varchar2(1000));  

- намеренно не используйте PK, чтобы сделать пример как можно более простым. Заполнение используется для имитации реальной загрузки данных в каждой записи

с множеством записей:

insert into t (id, padding)
select rownum, rpad(' ', 1000) from dual connect by level < 10000

Теперь, если вы спросите что-то вроде

select 1 into ll_exists
from t where id = 5;

, БД должна пройти через всю таблицу, нашла ли она единственную совпадающую запись в первой блок данных (который, кстати, мы не можем знать, потому что он может быть вставлен разными способами) или в последнем. Это потому, что он не знает, что есть только одна соответствующая запись. С другой стороны, если вы используете ... и rownum = 1, он может прекратить просмотр данных после того, как запись будет найдена, потому что вы сказали ему, что другой совпадающей записи нет (или не требуется). Если запрос был

select id into ll_id
from t where mod (id, 2) = 1
and rownum = 1;

, то я могу получить от БД ответ 1, а также 3, а также 123 ... порядок не гарантируется, и это является следствием. (без предложения rownum я получил бы исключение TOO_MANY_ROWS. Это зависит от ситуации, которая хуже)

Если вам действительно нужен запрос, который проверяет существование, то ЗАПИШИТЕ ЭТО ТАК.

begin

select 'It does' 
  into ls_exists
from dual where
exists (your_original_query_without_rownum);

do_something_when_it_does_exist
exception
  when no_data_found then
    do_something_when_it_doesn't_exist
end;
7
ответ дан 18 December 2019 в 12:01
поделиться

Одно из практических правил оптимизации - не делать этого, если у вас нет точки доступа, которую нужно исправить. Однако, если вам интересно узнать о преимуществах производительности, вы можете запустить несколько тестов, используя оба, чтобы посмотреть, сможете ли вы измерить какое-либо улучшение производительности.

Википедия цитирует слова Дональда Кнута:

«Мы должны забыть о небольшой эффективности, скажем, примерно в 97% случаев: преждевременная оптимизация - корень всех зол».

5
ответ дан 18 December 2019 в 12:01
поделиться

Я собираюсь предположить, что это не стоит вашего времени. Современные оптимизаторы очень хороши в том, что они делают, поэтому я нахожу немного удивительным, что запрос, который РАЗРЕШЕНО возвращать только одну строку, приведет к значительному увеличению производительности за счет добавления ROWNUM = 1.

Прирост производительности якобы из-за устранения необходимости проверять это ограничение?

Я обнаружил, что когда я перестаю доверять оптимизатору, я часто копаю себе более глубокую могилу;)

Дополнительно: Если сомневаетесь, попробуйте. Найдите большое соединение, запустите его несколько раз без rownum = 1, несколько раз с rownum = 1 и посмотрите, заметили ли вы значительное улучшение в процентах. Чтобы убедиться в отсутствии проблем с кешированием, я бы посоветовал сделать это в базе данных, которую можно перезапустить.

2
ответ дан 18 December 2019 в 12:01
поделиться

If you ask for COUNT(1) then Oracle must find all the matching rows to satisfy your exact answer.

SELECT COUNT(1) FROM ....

If you ask for 1 from the first row, Oracle can stop once it has found one matching row.

SELECT 1 FROM ... WHERE ROWNUM = 1

It is good practice to only ask for the data that you actually need. Why get Oracle to tell you there are 1,203,499 matching results when you only care about the first one? People have mentioned that the optimizer can improve things. However, it still has to answer the question you asked. If you ask an easier question it can come up with the answer quicker.

The times it is likely to have a significant impact on performance:- * Фактическое количество найденных вами записей велико, * Oracle переключается с плана HASH JOIN на NESTED LOOP, и план вложенного цикла лучше подходит для поиска первой строки

0
ответ дан 18 December 2019 в 12:01
поделиться

Существенно ли увеличивает производительность введение ROWNUM = 1?

Это может иметь очень существенное значение. Если вас интересует только первая строка, которую база данных находит при выполнении запроса, то лучше всего сообщить об этом Oracle, добавив «ROWNUM = 1». Если вы этого не сделаете, Oracle предположит, что вы собираетесь в конечном итоге получить все строки из запроса, и соответствующим образом оптимизирует запрос.

В случае COUNT (), если вы хотите знать, есть ли хотя бы Одна запись, оптимизатор запросов этого не узнает и будет считать каждую строку - пустая трата времени. Если вы добавите ROWNUM = 1, вы дадите оптимизатору возможность остановиться, как только он найдет строку.

Если да, то при каких условиях производительность будет особенно улучшена (например, множество объединений, ограничения для неиндексированных столбцов, большие таблицы, большие набор результатов)

Чем больше данных необходимо обработать запросу, чтобы ответить на ваш запрос, тем больше вероятность повышения производительности с помощью предиката ROWNUM = 1. Например, при объединении нескольких таблиц добавление ROWNUM = 1 могло бы изменить план, отказавшись от использования большого количества дорогостоящих хеш-объединений, чтобы вместо этого использовать вложенные циклы, которые намного быстрее при наличии строк.

0
ответ дан 18 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: