Вопрос

В Oracle при запросе на существование строки почему Select 1 быстрее, чем Select count (*)?

Это было полезно?

Решение

Поскольку Oracle не поддерживает IF EXISTS в PL / SQL, предложение CodeByMidnight об использовании EXISTS обычно делается с чем-то вроде

SELECT 1 
  INTO l_local_variable 
  FROM dual 
 WHERE EXISTS( 
    SELECT 1 
      FROM some_table 
     WHERE some_column = some_condition ); 

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

(Примечание. Я хотел бы опубликовать это как комментарий к сообщению CodeByMidnight, но комментарии не могут содержать отформатированный код).

ОБНОВЛЕНИЕ: Учитывая разъяснение, которое исходный плакат сделал в своем комментарии, короткий, окончательный ответ заключается в том, что SELECT 1 или SELECT COUNT (1) не быстрее, чем SELECT COUNT (*) . Вопреки всем рекомендациям по кодированию, которые вы просматриваете, COUNT (*) является предпочтительным способом подсчета всех строк. Был старый миф, что COUNT (1) был быстрее. Как минимум, это не было правдой ни в одной версии Oracle, выпущенной в последнее десятилетие, и вряд ли это когда-либо было правдой. Однако это было широко распространенное убеждение. Сегодня код, который выполняет COUNT (1) , а не COUNT (*) , обычно заставляет меня подозревать, что автор склонен верить различным мифам об Oracle, поэтому я бы предложить использовать COUNT (*) .

Другие советы

Лучше по-прежнему использовать EXISTS там, где СУБД поддерживает его, или его эквивалент, поскольку это остановит обработку строк, как только будет найдено совпадение.

Я был бы удивлен, если бы select count (*) не был должным образом оптимизирован, нет необходимости загружать все столбцы, поскольку не будет никакой обработки, связанной со столбцами.

http://www.dbasupport.com/forums /archive/index.php/t-28741.html

По крайней мере, для Oracle.

Поскольку звезда учитывает все столбцы, "1" является родным типом данных.

В MySQL " SELECT COUNT (name_of_the_primary_key) " должно быть так же быстро, как ваш SELECT 1. Это индекс, который имеет значение. Count () для индекса должен быть довольно быстрым;)

Я не думаю, что это верно для Oracle. http://justoracle.blogspot.com/2006/12/count- против-count1.html

Но в некоторых базах данных причина в том, что '*' должен посещать метаданные таблиц. Это имеет тенденцию добавлять ненужные накладные расходы. Где 1 - просто литерал.

При прочих равных условиях " select 1 from my_table " вернет результат first быстрее, чем " select count (*) из my_table " , но если вы получите все результаты запроса, один из count (*) будет быстрее, поскольку в нем содержится намного меньше данных (1 целое число, а не 1 целое число в каждой строке). в таблице).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top