logo

Как получить количество строк в таблицах SQL Server

Быстрый ответ

Для эффективного подсчёта строк в каждой таблице базы данных SQL Server, используйте следующий SQL-запрос с применением системных представлений sys.tables и sys.partitions:

SQL
Скопировать код
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', чтобы исключить системные таблицы.
  • Правильный контекст базы данных: Гарантируйте выполнение запросов в соответствующем контексте данных.
  • Актуальность данных: В динамичных средах для поддержания актуальности информации может понадобиться повышение уровня изоляции транзакций.

Визуализация

Можем упростить восприятие запроса, представив таблицы в виде ингредиентов на кухне:

Markdown
Скопировать код
Кухня: 🏡
Ингредиенты: [🍏🥦🍞🧀]

Наша цель — подсчитать количество каждого ингредиента:

SQL
Скопировать код
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;

И вот получившийся результат:

Markdown
Скопировать код
| Ингредиент | Количество |
| -----------| -----------|
| 🍽️ Яблоки  | 🍴 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', чтобы подсчет включал только пользовательские таблицы.

Полезные материалы

  1. Подробная инструкция по подсчету строк таблиц – Stack Overflow
  2. Таинства TABLE_ROWS – Microsoft Learn
  3. Неординарные способы подсчета строк – SQL Server Guru