select count(*) from table и select count(id) from table ?)
вроде нет, интересно что другие скажут. А вообще самый лучший способ самому протестить
Это разные запросы. Если в столбце id будут встречаться null, то результат будет отличаться
ну если учесть, что id - это PK not null то count(*) / count(id) это одно и то же и разница только в написании?
В PG count(PK) вроде всё равно делает seq scan, а не PK-индекс читает (в Oracle вроде так было, давно не проверял), так что разница будет околонулевая, скорее всего. Зато точно не стоит делать в PG count(1) и т.п. - это 100% будет медленнее, чем count(*), потому что PG честно парсит, подставляет в каждую строку и проверяет на null выражение в count. В других СУБД это не всегда так, в Oracle count(1) и count(*) - синонимы.
Вы проверяли? https://dbfiddle.uk/3RohuHw2
см. https://www.postgresql.org/message-id/flat/df354b76-a645-73fc-9645-4508e5291d71%40gmx.net
Ну там разница на границе погрешности, если не считать миллионы строк. Но в принципе, я не понимаю, откуда распространилась идея писать count(1). Для подсчета числа строе есть 2 нормальные идиомы: count(*) и count(nullable_field).
почему бы не посчитать миллионы с другой стороны. Tom Lane (вроде, не последний человек) по ссылке подтверждает, что да, они этот момент не оптимизировали
Ну то, что до сих пор никто этого не сделал, говорит о том, что это никому особо не интересно
тем не менее, в вопросе на цитируемый вопрос ответ есть, и почему бы не делать так, даже разница минимальна, но почему бы ее не использовать
Емнип, в статьях про оптимизацию мускуля из нулевых такое встречалось. Типа такого: https://web.archive.org/web/20080228084946/http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/
Да это старые мифы все, oracle вообще count(1) к count(*) при выполнении преобразует 😂
Старые - да, хоть и не совсем мифы, но вроде других источников этой практики не наблюдается.
Обсуждают сегодня