SQL Server 2008 - найдите таблицу с большим количеством строк

17

Есть ли способ в SQL Server 2008 найти таблицу с наибольшим количеством строк в базе данных?

    
задан mr_dunski 01.10.2009 в 20:26
источник

3 ответа

32

Это закроет вас:

SELECT 
    [TableName] = so.name, 
    [RowCount] = MAX(si.rows) 
FROM 
    sysobjects so, 
    sysindexes si 
WHERE 
    so.xtype = 'U' 
    AND 
    si.id = OBJECT_ID(so.name) 
GROUP BY 
    so.name 
ORDER BY 
    2 DESC
    
ответ дан Chris Ballance 01.10.2009 в 20:29
источник
  • Отлично работает. Спасибо. –  mr_dunski 01.10.2009 в 20:41
  • Выглядит очень хорошо! Будет ли он работать с таблицами, у которых нет индекса (или первичного ключа, который автоматически становится индексом)? –  MaxiWheat 01.10.2009 в 20:43
  • Я не понимаю, почему он не будет работать с таблицами без явного индекса. –  Chris Ballance 01.10.2009 в 20:50
  • Обратите внимание, что sysindexes является представлением совместимости и может быть недоступен в некоторых будущих выпусках. Кроме того, фактическое количество строк может не соответствовать sysindexes.rows, потому что sysindexes.rows не обновляется для каждой модификации таблицы. Если вам нужны точные подсчет строк, вы должны использовать COUNT (*) и получить доступ к фактической таблице. Наконец, в SQL Server 2008 есть отфильтрованные индексы, поэтому количество строк в индексе может быть меньше, чем в таблице, которую он индексирует. Поскольку вы ищете MAX, это не проблема, но это означает, что это не может быть обобщено очевидным образом. –  Steve Kass 01.10.2009 в 22:49
  • +1 @Steve Kass благодарит за должную осмотрительность в отношении краевых случаев для запроса, который я разместил! –  Chris Ballance 26.11.2009 в 14:09
8

Вот в основном тот же T-SQL, что и Chris Ballance, но с использованием новых представлений каталога объектов вместо представлений совместимости:

SELECT  SchemaName = schemas.[name],
        TableName = tables.[name],
        IndexName = indexes.[name],
        IndexType =
            CASE indexes.type
                WHEN 0 THEN 'Heap'
                WHEN 1 THEN 'Clustered'
            END,
        IndexPartitionCount = partition_info.PartitionCount,
        IndexTotalRows = partition_info.TotalRows
FROM    sys.tables
        JOIN sys.indexes
            ON  tables.object_id = indexes.object_id
                AND indexes.type IN ( 0, 1 )
        JOIN (  SELECT object_id, index_id, PartitionCount = COUNT(*), TotalRows = SUM(rows)
                FROM sys.partitions
                GROUP BY object_id, index_id
        ) partition_info
            ON  indexes.object_id = partition_info.object_id
                AND indexes.index_id = partition_info.index_id
        JOIN sys.schemas ON tables.schema_id = schemas.schema_id
ORDER BY SchemaName, TableName;
    
ответ дан Kenny Evitt 16.03.2012 в 15:28
источник
  • Форматирование этого удивительно, у нас есть сложная база данных электронной коммерции с несколькими схемами, а опции видимости и сортировки здесь превосходны. Мое единственное изменение заключается в том, чтобы добавить «IndexTotalRows DESC» в качестве первого параметра в «ORDER BY», чтобы я мог видеть, где мои таблицы раздуваются моим кодом, преднамеренно или иным образом –  James Gray 14.01.2015 в 21:48
  • Спасибо за добавление версии, основанной на Каталог объектов, Кенни. –  Chris Ballance 17.08.2016 в 14:59
0

Я просто настроил свой SSMS 2008, чтобы показать следующие дополнительные столбцы для таблиц - Количество строк - Используемое пространство данных (KB)

для баз данных - Первичное местоположение данных - Последняя дата резервного копирования - Дата создания ....

Работает быстрее для меня большую часть времени, не открывая запрос, я просто нажимаю на заголовок столбца, чтобы перейти к ASC или DESC

    
ответ дан jerryhung 01.10.2009 в 21:40
источник
  • Как вы вносили изменения в SSMS? –  Kenny Evitt 16.03.2012 в 15:29