Подсчет количества строк в таблице может показаться простой задачей, но это может существенно повлиять на производительность вашего SQL Server. Каждый раз, когда вы выполняете запрос COUNT(*), SQL Server должен сканировать индекс или кучу, чтобы подсчитать количество строк и отправить его в ваше приложение. Это может привести к ненужным чтениям и блокировкам.
В предыдущей статье блога от Jes Schultz Borland и Aaron Bertrand они обсудили, почему использование COUNT(*) не является эффективным инструментом для этой задачи. Вместо этого они предложили альтернативные методы, такие как запрос метаданных таблицы или использование sys.partitions для получения количества строк.
Один из распространенных подходов – использовать следующий запрос:
SELECT SUM(p.rows)
FROM sys.partitions p
WHERE p.object_id = OBJECT_ID('MyTable')
AND p.index_id IN (0,1); -- куча или кластеризованный индекс
Этот запрос получает количество строк, суммируя строки из таблицы sys.partitions. Хотя этот метод работает, он может быть довольно громоздким и подвержен ошибкам.
К счастью, существует более короткая версия этого запроса, которая полагается на системную функцию OBJECTPROPERTYEX:
SELECT OBJECTPROPERTYEX(OBJECT_ID('MyTable'),'cardinality')
Этот запрос получает количество строк напрямую из метаданных таблицы с использованием функции OBJECTPROPERTYEX. Он короче, легче запомнить и избегает ненужных объединений с другими системными таблицами.
При анализе производительности этого запроса было обнаружено, что он читает данные из системных таблиц sysallocunits и sysrowsets. Эту информацию было получено путем настройки сеанса Extended Events для захвата событий lock_acquired.
В заключение, подсчет количества строк в таблице не так прост, как может показаться. Избегая использования COUNT(*) и используя альтернативные методы, такие как запрос метаданных таблицы или использование функции OBJECTPROPERTYEX, вы можете улучшить производительность ваших запросов SQL Server.
Наслаждайтесь использованием этого более короткого и эффективного подхода к подсчету строк в ваших таблицах SQL Server!