count(*) или count(1)

wwwlz-grand
Дата: 20.10.2015 11:58:08
Добрый день.

Подскажите, пожалуйста, чем отличается count(*) от count(1) и в каких случаях? Если вообще, чем-то отличаются.

Погуглил, но не нашел. Просьба, если есть, скинуть ссылку, где об этом рассказывается.
eev
Дата: 20.10.2015 12:02:33
wwwlz-grand
Дата: 20.10.2015 12:06:39
Понял, абсолютно ничем не отличаются. Спасибо!
AlexFF__|
Дата: 20.10.2015 12:07:48
wwwlz-grand
Добрый день.

Подскажите, пожалуйста, чем отличается count(*) от count(1) и в каких случаях? Если вообще, чем-то отличаются.

Погуглил, но не нашел. Просьба, если есть, скинуть ссылку, где об этом рассказывается.

Используя count(1) вместо count(*) ты сэкономишь много своего времени на объяснения новым сотрудникам.
результат заранее известен
Дата: 20.10.2015 12:08:00
wwwlz-grand,

самый быстрый - count(null)
Пыщ-пыщ мобайл
Дата: 21.10.2015 00:39:08
результат заранее известен
wwwlz-grand,

самый быстрый - count(null)
это если в таблице nullы, если в таблице звёздочки, то count(*) будет быстрее. Если единички - то count(1) придёт первым. Ну и так далее, идея, я думаю, понятна.
SeaGate
Дата: 21.10.2015 07:29:19
wwwlz-grand,

wwwlz-grand
Подскажите, пожалуйста, чем отличается count(*) от count(1) и в каких случаях? Если вообще, чем-то отличаются.

На эту тему вспоминается баг, который в последние недели регулярно в рассылке MOS Hot Topics приходит, т.к. я его в favorites добавил:
Bug 19450314 : UNNECESSRAY INVALIDATIONS IN 12C
Демонстрация в 12.1.0.2.10 (DBBP for Engineering Systems and DBIM):
+
SQL> create table t(x int);
SQL> 
SQL> create or replace view vw_count_star
  2  as
  3  select count(*) cnt
  4    from t
  5  /
SQL> create or replace view vw_count_1
  2  as
  3  select count(1) cnt
  4    from t
  5  /
SQL> 
SQL> select object_name, status
  2    from obj
  3   where object_name in ('VW_COUNT_STAR', 'VW_COUNT_1')
  4   order by 1;

OBJECT_NAME          STATUS
-------------------- ---------------------
VW_COUNT_1           VALID
VW_COUNT_STAR        VALID
SQL> 
SQL> exec dbms_stats.gather_table_stats( '', 't', method_opt=> 'for columns (mod(x,2)) size auto')
SQL> 
SQL> select object_name, status
  2    from obj
  3   where object_name in ('VW_COUNT_STAR', 'VW_COUNT_1')
  4   order by 1;

OBJECT_NAME          STATUS
-------------------- ---------------------
VW_COUNT_1           INVALID
VW_COUNT_STAR        VALID

Еще нужно учесть, что с 12c extended statistics генерируется автоматом. Т.е. невалидные объекты в БД могут возникнуть "внезапно" после очередного сбора статистики.
Другие побочные эффекты этой новой возможности отметил Dom Brooks в блоге Martin Bach неделю назад: Little things worth knowing: automatic generation of extended statistics in 12c
SY
Дата: 21.10.2015 14:20:42
Пыщ-пыщ мобайл
результат заранее известен
wwwlz-grand,

самый быстрый - count(null)
это если в таблице nullы, если в таблице звёздочки, то count(*) будет быстрее. Если единички - то count(1) придёт первым. Ну и так далее, идея, я думаю, понятна.


A подумать? Ник "результат заранее известен" не на что не намекает?

SY.
Elic
Дата: 21.10.2015 14:26:04
SY
A подумать?
Чего тут думать?! Зачётное продолжение лёгкого троллинга.
stax..
Дата: 21.10.2015 14:32:59
AlexFF__|
wwwlz-grand
Добрый день.

Подскажите, пожалуйста, чем отличается count(*) от count(1) и в каких случаях? Если вообще, чем-то отличаются.

Погуглил, но не нашел. Просьба, если есть, скинуть ссылку, где об этом рассказывается.

Используя count(1) вместо count(*) ты сэкономишь много своего времени на объяснения новым сотрудникам.

дело вкуса
імхо
пользовать *, ведь ето отдельно оговоренный в доке случай что будет считаться все игнорируя null

понятно что 1 константа not null но с таким же успехом можно кодить count(1962)

.....
stax