Ответ 1
Нет, COUNT(*)
не является операцией с постоянным временем. A COUNT(*)
должен возвращать количество строк, которые соответствуют текущему предикату сканирования (т.е. Предложение WHERE
), так что только это сделало бы возврат свойства метаданных недействительным. Но даже если у вас нет предикатов, COUNT все еще должен удовлетворять текущей семантике изоляции транзакции, т.е. верните количество видимых строк (например, зафиксировано). Поэтому COUNT
должен, и будет, в SQL Server, проверять и подсчитывать строки. Некоторые системы позволяют вернуть более быструю оценку".
Кроме того, в качестве побочного комментария, полагаясь на rows
в sys.partitions
, ненадежна. В конце концов, если этот счет будет гарантирован точным, нам не понадобится DBCC UPDATEUSAGE(...) WITH COUNT_ROWS
. Существует несколько сценариев, которые исторически могут привести к тому, что этот счетчик будет дрейфовать отдельно от реальности (в основном, минимально зарегистрированные вложенные откаты), все, что я знаю, исправлено, но все еще оставляет проблемы с 1) обновленными таблицами из более ранних версий с ошибками и 2 ) другие, еще не обнаруженные, ошибки.
Кроме того, зачем нам "загружать" целые строки (как указано в сообщении, который я связал), чтобы их подсчитать? Должны ли индексы или ПК и т.д. Быть достаточными для их подсчета?
Это не 100% истинно. Существует не менее двух сценариев, которые не "загружают целые строки":
- Узкие индексы rowstore загружают только строку 'index', которая может быть намного меньше
- данные столбцов хранят только соответствующие сегменты столбца.
И большинство из того, что я говорю выше, не относятся к таблицам Hekaton.