Когда использовать Count (PK_ID) и когда использовать системные таблицы?

#sql #sql-server

#sql #sql-сервер

Вопрос:

Мы можем использовать либо count(<column_name>) , либо системные таблицы, чтобы получить количество строк в таблице. Тогда где использовать какую из них?

Спасибо Devi

Ответ №1:

Используйте оценки системных таблиц / планировщика, когда (быстрое) приблизительное количество строк приемлемо. Для этого требуется, чтобы статистика таблицы была достаточно точной.

Комментарии:

1. Существует ли какая-либо ситуация, когда статистика таблицы не будет точной в sys table?

2. Это зависит от системы. В PostgreSQL, например, статистика ненадежна, пока вы не заполните несколько страниц диска и не запустите вручную analyze . Или когда вы выполняете огромные пакетные вставки, обновления и удаления без последующего запуска analyze .

Ответ №2:

Когда COUNT(*) (без каких-либо WHERE условий) начинает занимать более 10 секунд, именно тогда я обычно отменяю запрос и начинаю использовать системные таблицы с этого момента. Очевидно, что если есть WHERE условия, то вы можете получить ответ только через COUNT(*) (или COUNT(<column>) )

Как только таблица становится достаточно большой и COUNT(*) работает плохо, точный ответ обычно все равно не требуется.

Комментарии:

1. В некоторых системах (например, PostgreSQL) статистика позволяет explain возвращать разумную оценку строк даже с предложениями where, если они достаточно близки к реальности.

2. Насколько большой должна быть таблица, чтобы занять около 10 секунд?

3. @Magnus — это зависит от вашего оборудования, ширины строк и т.д., Но я видел, как это происходит с таблицами с 10 миллионами строк.

Ответ №3:

Используйте COUNT() всякий раз, когда все, что вам нужно, — это количество строк из любой одной таблицы. Используйте системные таблицы, только если вам нужна дополнительная информация, кроме количества строк (например, используемое пространство, а что нет).

Комментарии:

1. С другой стороны — определение точного количества строк с помощью COUNT(*) может занять много времени в больших таблицах — возможно, достаточно мгновенного получения приблизительных чисел из представлений системного каталога