В Oracle, когда запрашивается существование строки, почему выбрано 1 быстрее, чем Select count (*)?Почему выбрано 1 быстрее, чем Выбрать счетчик (*)?
ответ
Поскольку 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(*)
.
Поскольку звезда принимает все cols в счет, «1» является родным типом данных.
В MySQL «SELECT COUNT (name_of_the_primary_key)» должно быть так же быстро, как ваш SELECT 1. Его индекс, который считается. Подсчет() по индексу должен быть довольно быстро;)
http://www.dbasupport.com/forums/archive/index.php/t-28741.html
Для Oracle, по крайней мере.
Я был бы удивлен, если бы подсчет (*) не был должным образом оптимизирован, нет необходимости загружать во всех столбцах, поскольку обработка, связанная с столбцом, не будет.
да. Oracle обрабатывает count (*) точно так же, как count (1), count (null), count («любое атомное значение, которое вам нравится»). –
Лучше использовать EXISTS, где RDBMS поддерживает его или эквивалент, так как это прекратит обработку строк, как только найдет совпадение.
+1 Нам нужно использовать только COUNT(), нам нужно знать фактическое количество задействованных записей. – APC
Я не думаю, что это верно для Oracle. http://justoracle.blogspot.com/2006/12/count-vs-count1.html
Но в некоторых базах данных причина заключается в том, что '*' должен посещать метаданные таблиц. Это, как правило, добавляет ненужные накладные расходы. Где как 1 буквально.
При прочих равных условиях, "select 1 from my_table"
будет возвращать результат первый быстрее, чем "select count(*) from my_table"
, но если вы получить все результаты запроса, count(*)
один будет быстрее, потому что она включает в себя гораздо меньше данных (1 целое число, как против 1 целых чисел для каждой строки в таблице).
, не зная, какой двигатель RDBMS вы используете, нет способа ответить правильно. Различные двигатели ведут себя по-другому – Glen
Вы имеете в виду «почему выбрано count (1) быстрее, чем Select count (*)»? –
Я имею в виду «Выбрать 1».Я смотрю на какую-то старую, автономную стандартную документацию по кодированию, где утверждается, что «Выбрать 1» быстрее, чем «Выбрать счетчик (*)», и предпочтительный способ запроса существования строки. В документации не содержится технического объяснения, почему это метод повышения производительности. Когда я искал в сети, я нашел такие вещи, как темы и дискуссии AskTom ... но я не видел четкого, окончательного ответа. – 2009-09-10 17:04:48