Почему Select 1 быстрее чем Select count (*)? - PullRequest
10 голосов
/ 10 сентября 2009

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

Ответы [ 7 ]

15 голосов
/ 10 сентября 2009

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

14 голосов
/ 10 сентября 2009

Поскольку 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(*).

2 голосов
/ 10 сентября 2009

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

1 голос
/ 10 сентября 2009
0 голосов
/ 14 сентября 2009

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

0 голосов
/ 10 сентября 2009

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

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

0 голосов
/ 10 сентября 2009

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

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

...