Ваш босс введен в заблуждение (в лучшем случае).
Да, PostgreSql (по крайней мере, те, которые я использовал, до 8.1) действительно обрабатывает count
немного по-другому, поскольку ему нужно перейти к реальной таблице, чтобы получить некоторую информацию, а не просто использовать только индекс MVCC , он хранит «мягкую» информацию об удалении в таблице, поэтому необходимо извлечь каждую строку, чтобы увидеть, была ли она удалена, но еще не удалена из индекса).
Но он должен это делать независимо от того, используете ли вы *
или pk_column
для подсчета. Преимущество использования *
состоит в том, что СУБД может свободно выбирать любой ненулевой столбец для счетчика, что может привести к меньшему количеству дискового ввода-вывода для обработки индекса.
Если ваш начальник беспокоится о производительности, есть несколько возможных «хитростей», которые вы можете использовать.
Во-первых, если вас интересует только существование строк, а не число , , вы можете использовать код изменения, например:
select count(*) into myCount from myTable where myCondition;
if myCount > 0 then
do something
end if;
в
if exists ( select * from myTable where myCondition ) then
do something
end if;
Во-вторых, вы можете использовать триггеры insert
и delete
, которые поддерживают два счетчика в отдельной таблице для добавленных строк и удаленных строк. Затем вы можете рассчитать количество строк, просто вычитая одно из другого. Использование двух отдельных счетчиков предотвращает сериализацию в операциях вставки / удаления, но это все еще является огромным препятствием и, вероятно, не требуется для огромного числа случаев.
Вам также необходимо периодически уменьшать счетчики (например, изменить 1000 inserts + 200 deletes
на 800 inserts and 0 deletes
).
В-третьих, вы можете получить оценку количества строк (на основе последней операции анализа), используя:
select reltuples from pg_class where relname = 'myTable';