Получение количества записей в таблицах MS SQL

Получение количества записей в таблицах MS SQL

Получение количества записей в таблицах на уровне СУБД (MS SQL)

При работе с базами данных часто возникает необходимость узнать количество записей в таблицах. В MS SQL существует несколько способов решения этой задачи, каждый со своими преимуществами и ограничениями.

Два основных метода

Можно выделить два основных метода получения количества записей в таблицах СУБД:

Метод Точность Производительность Применение
Точный Точное количество записей Медленно на больших таблицах Когда нужна абсолютная точность и время выполнения не критично
Производительный Приблизительное количество Мгновенно даже на больших таблицах Когда важна скорость и допустима небольшая погрешность

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

1. Простой способ (точный подсчёт)

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

-- Создаём временную таблицу для хранения результатов
CREATE TABLE #counts(table_name varchar(255), row_count int)

-- Используем системную процедуру sp_MSForEachTable для перебора всех таблиц
EXEC sp_MSForEachTable 
@command1='INSERT #counts (table_name, row_count) SELECT ''?'', COUNT(*) FROM ?', 
@Whereand ='and o.name LIKE ''_AccRgAT%'''	-- Отбор на таблицы по шаблону имени

-- Выводим результаты, отсортированные по количеству записей (по убыванию)
SELECT table_name, row_count FROM #counts ORDER BY row_count DESC

-- Удаляем временную таблицу
DROP TABLE #counts

В этом примере:

  • Создаётся временная таблица #counts для хранения результатов
  • Системная процедура sp_MSForEachTable перебирает все таблицы (с фильтром по имени)
  • Для каждой таблицы выполняется COUNT(*) и результат сохраняется
  • Результаты сортируются по количеству записей (по убыванию)

2. Сложный способ (быстрый, через статистику)

Этот метод использует системные представления sys.partitions и sys.indexes для быстрого получения приблизительного количества записей.

SELECT  
  OBJECT_NAME(p.object_id) AS TableName,
  SUM(p.Rows) AS Rows_count
  FROM sys.partitions p	-- Обращение к партициям
-- Если закоментировать этот кусок
  JOIN sys.indexes i
  ON i.object_id = p.object_id			
  AND i.index_id = p.index_id	
  WHERE i.type_desc IN ( 'CLUSTERED', 'HEAP' )
-- то также получим количество связанных строк (включая все индексы)
  GROUP BY p.object_id	-- Группируем по таблице
  ORDER BY Rows_count DESC 	-- Сортируем по количеству

Особенности этого запроса:

  • Использует системное представление sys.partitions, где хранится статистика по разделам таблиц
  • Соединяется с sys.indexes для фильтрации по типам индексов
  • Фильтр i.type_desc IN ( 'CLUSTERED', 'HEAP' ) ограничивает выбор только кластерными индексами и кучами (HEAP)
  • Если закомментировать часть с JOIN и WHERE, будут учитываться все индексы
  • Результаты группируются по идентификатору объекта и сортируются по количеству записей

Совет: Для самых точных результатов при использовании второго метода рекомендуется предварительно обновить статистику с помощью команды UPDATE STATISTICS или выполнить полное сканирование базы данных.

Заключение

Выбор между этими методами зависит от конкретной ситуации:

  • Если нужна абсолютная точность и время выполнения не критично - используйте первый метод
  • Если важна скорость и допустима небольшая погрешность - второй метод будет предпочтительнее
  • Для очень больших таблиц можно комбинировать подходы: быстрый подсчёт для всех таблиц и точный - только для ключевых

Оба метода могут быть адаптированы для конкретных нужд путём добавления дополнительных условий фильтрации или сортировки.

Комментарии

Популярные сообщения из этого блога

Удивительные коллекции 1С

Символы alt-кодов