Как получить количество строк в таблицах SQL Server
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для эффективного подсчёта строк в каждой таблице базы данных SQL Server, используйте следующий SQL-запрос с применением системных представлений sys.tables и sys.partitions:
SELECT t.NAME AS TableName, SUM(p.rows) AS RowCount
FROM sys.tables t
INNER JOIN sys.partitions p ON t.object_id = p.object_id
WHERE p.index_id IN (0, 1) -- Учитываем только кучи и кластерные индексы
GROUP BY t.NAME
ORDER BY RowCount DESC;
Этот подход поволяет исключить системные таблицы и предотвращает подсчет строк для некластерных индексов.
Погружение в суть: Производительность и точность
На больших базах данных важно выбирать решения, которые упрощают решение задач:
- sys.tables и sys.partitions: Минимальное число условий в запросе для обеспечения высокой производительности.
- WHERE p.index_id IN (0, 1): Выбираем только кластерные индексы и кучи для точного подсчета строк.
- GROUP BY t.NAME: Группировка результатов по именам таблиц помогает исключить дублирование.
- ORDER BY RowCount DESC: Сортировка облегчает определение таблиц с наибольшим количеством строк.
Обход подводных камней: избегание типичных проблем
Такие простые решения иногда могут создавать сложности. Чтобы их избежать:
- Только пользовательские таблицы: Добавьте
AND t.type = 'U'
, чтобы исключить системные таблицы. - Правильный контекст базы данных: Гарантируйте выполнение запросов в соответствующем контексте данных.
- Актуальность данных: В динамичных средах для поддержания актуальности информации может понадобиться повышение уровня изоляции транзакций.
Визуализация
Можем упростить восприятие запроса, представив таблицы в виде ингредиентов на кухне:
Кухня: 🏡
Ингредиенты: [🍏🥦🍞🧀]
Наша цель — подсчитать количество каждого ингредиента:
SELECT
'🍽️' + TABLE_NAME,
'🍴 x ' + CAST(ROW_COUNT AS VARCHAR)
FROM
INFORMATION_SCHEMA.TABLES
CROSS APPLY (
SELECT
COUNT(*) AS ROW_COUNT
FROM
[🍽️TABLE_NAME]
) AS RC;
И вот получившийся результат:
| Ингредиент | Количество |
| -----------| -----------|
| 🍽️ Яблоки | 🍴 x 12 |
| 🍽️ Брокколи| 🍴 x 5 |
| 🍽️ Хлеб | 🍴 x 20 |
Приятного аппетита! 🎉
Красота уборки: Поддержание порядка после выполнения запросов
Соблюдайте следующие правила при работе с SQL-запросами:
- Удаление временных таблиц: Если использовали временные таблицы, например,
#counts
, не забудьте удалить их командойDROP TABLE #counts
. - Учет блокировок: После выполнения запросов убедитесь, что не осталось блокировок, препятствующих нормальной работе в многопользовательской среде.
Готовы к работе на крупных базах данных
Следующие решения подойдут для работы с большими объемами данных:
- sp_MSForEachTable: Недокументированная хранимая процедура — секретное оружие знатоков SQL. Используйте с осознанным риском!
- ASYNC_STATISTICS_UPDATE: Включение этой опции может ускорить работу со статистикой и позволит быстрее получить результат.
Нежеланные гости: Исключение системных таблиц
Важно исключить системные объекты из подсчета:
- Исключаем системные таблицы: Используйте атрибут
is_ms_shipped
или функциюOBJECTPROPERTY
, чтобы отфильтровать системные таблицы. - Фильтрация с OBJECT_TYPE: Добавьте условие
AND OBJECT_TYPE(t.object_id) = 'U'
, чтобы подсчет включал только пользовательские таблицы.