Получение количества записей в таблицах 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
или выполнить полное сканирование базы данных.
Заключение
Выбор между этими методами зависит от конкретной ситуации:
- Если нужна абсолютная точность и время выполнения не критично - используйте первый метод
- Если важна скорость и допустима небольшая погрешность - второй метод будет предпочтительнее
- Для очень больших таблиц можно комбинировать подходы: быстрый подсчёт для всех таблиц и точный - только для ключевых
Оба метода могут быть адаптированы для конкретных нужд путём добавления дополнительных условий фильтрации или сортировки.
Комментарии
Отправить комментарий