Счетчик строк таблицы SQL отличается от счетчика выбора в SQL Server - PullRequest
4 голосов
/ 28 октября 2009

Я использую Microsoft SQL Server.

У меня есть таблица, которая была обновлена ​​на 80 строк.

Если я щелкну правой кнопкой мыши и посмотрю на свойства таблицы, счетчик строк скажет 10000, но выбор Количество (id) из TableName указывает 10080.

Я проверил статистику, и у них также есть количество строк 10080.

Почему существует разница между Rocount в свойствах и счетчиком выбора?

Спасибо, S

Ответы [ 4 ]

4 голосов
/ 28 октября 2009

Эта информация, скорее всего, поступает из таблицы sysindexes (см. Документацию) и информация в sysindexes не обязательно будет актуальной. Это известный факт в SQL Server.

Попробуйте запустить DBCC UPDATEUSAGE и проверьте значения еще раз.
Ссылка: http://msdn.microsoft.com/en-us/library/ms188414.aspx

DBCC UPDATEUSAGE исправляет строки, используемые страницы, зарезервированные страницы, листовые страницы и страница данных рассчитывает для каждого раздел в таблице или индексе. Если нет никаких неточностей в системные таблицы, DBCC UPDATEUSAGE не возвращает данных. Если неточности найдено и исправлено и СО NO_INFOMSGS не используется, DBCC UPDATEUSAGE возвращает строки и столбцы обновляются в системе таблицы.

Пример:

DBCC UPDATEUSAGE (0)
2 голосов
/ 28 октября 2009

Обновить статистику. Только так RDBMS узнает текущее состояние ваших таблиц и индексов. Это также помогает СУБД выбрать правильный путь выполнения для оптимальной производительности.

SQL Server 2005

UPDATE STATISTICS dbOwner.yourTableName;

Oracle

UPDATE STATISTICS yourSchema.yourTableName;
1 голос
/ 01 декабря 2014

Существует множество способов проверить размер таблицы.

http://blogs.msdn.com/b/martijnh/archive/2010/07/15/sql-server-how-to-quickly-retrieve-accurate-row-count-for-table.aspx упоминает 4 различной точности и скорости.

Всегда надежное полное сканирование таблицы немного медленное.

SELECT COUNT(*) FROM Transactions

а быстрая альтернатива зависит от статистики

SELECT CONVERT(bigint, rows)
FROM sysindexes
WHERE id = OBJECT_ID('Transactions')
AND indid < 2

Также упоминается, что графический интерфейс ssms использует запрос

SELECT CAST(p.rows AS float)
FROM sys.tables AS tbl
INNER JOIN sys.indexes AS idx ON idx.object_id = tbl.object_id and idx.index_id < 2
INNER JOIN sys.partitions AS p ON p.object_id=CAST(tbl.object_id AS int)
AND p.index_id=idx.index_id
WHERE ((tbl.name=N'Transactions'
AND SCHEMA_NAME(tbl.schema_id)='dbo'))

и что быстрый и относительно точный способ определения размера таблицы

SELECT SUM (row_count)
FROM sys.dm_db_partition_stats
WHERE object_id=OBJECT_ID('Transactions')   
AND (index_id=0 or index_id=1);

К сожалению, этот последний запрос требует дополнительных разрешений помимо базового выбора.

1 голос
/ 28 октября 2009

Информация о свойствах кэшируется в SSMS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...