#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(*)
может занять много времени в больших таблицах — возможно, достаточно мгновенного получения приблизительных чисел из представлений системного каталога