Запрос для списка количества записей в каждой таблице в базе данных

Я предпочитаю решение для основы события по следующим причинам

  • , Оно уменьшает стоимость записи. Намного легче сказать "+ = новый EventHandler", чем реализовать абсолютный интерфейс.
  • Это уменьшает затраты на обслуживание. Если Вы добавляете новое событие в свой класс, это - все, что должно быть сделано. Если Вы добавляете новое событие к интерфейсу, необходимо обновить каждого потребителя в кодовой базе. Или определите совершенно новый интерфейс, который со временем становится раздражающим потребителям, "Я реализую IRandomEvent2 или IRandomEvent5?"
  • События позволяют, чтобы обработчики были базирующимся неклассом (т.е. статический метод где-нибудь). Нет никакой функциональной причины вынудить все обработчики событий быть членом экземпляра
  • , Группировка набора событий в интерфейс делает предположение о том, как события используются (и это просто, что, предположение)
  • Интерфейсы не предлагают реального преимущества перед необработанным событием.
184
задан kristof 17 September 2009 в 23:27
поделиться

4 ответа

Если вы используете SQL Server 2005 и выше, вы также можете использовать это:

SELECT 
    t.NAME AS TableName,
    i.name as indexName,
    p.[Rows],
    sum(a.total_pages) as TotalPages, 
    sum(a.used_pages) as UsedPages, 
    sum(a.data_pages) as DataPages,
    (sum(a.total_pages) * 8) / 1024 as TotalSpaceMB, 
    (sum(a.used_pages) * 8) / 1024 as UsedSpaceMB, 
    (sum(a.data_pages) * 8) / 1024 as DataSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE 
    t.NAME NOT LIKE 'dt%' AND
    i.OBJECT_ID > 255 AND   
    i.index_id <= 1
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name, p.[Rows]
ORDER BY 
    object_name(i.object_id) 

На мой взгляд, с ним проще работать, чем с выводом sp_msforeachtable .

290
ответ дан 23 November 2019 в 05:56
поделиться

Если вы используете MySQL> 4.x, вы можете использовать следующее:

select TABLE_NAME, TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA="test";

Имейте в виду, что для некоторых механизмов хранения TABLE_ROWS является приблизительным значением.

-1
ответ дан 23 November 2019 в 05:56
поделиться

Первое, что пришло в голову, это использовать sp_msForEachTable

exec sp_msforeachtable 'select count(*) from ?'

, который не перечисляет имена таблиц, поэтому его можно расширить до

exec sp_msforeachtable 'select parsename(''?'', 1),  count(*) from ?'

. Проблема в том, что если база данных имеет более 100 таблиц, вы получите следующее сообщение об ошибке:

Запрос превысил максимум количество наборов результатов, которые могут быть отображается в таблице результатов. Только первые 100 наборов результатов отображается в сетке.

В итоге я использовал табличную переменную для хранения результатов

declare @stats table (n sysname, c int)
insert into @stats
    exec sp_msforeachtable 'select parsename(''?'', 1),  count(*) from ?'
select 
    * 
from @stats
order by c desc
1
ответ дан 23 November 2019 в 05:56
поделиться

Как видно здесь, это вернет правильные подсчеты, тогда как методы, использующие таблицы метаданных, будут возвращать только оценки.

    CREATE PROCEDURE ListTableRowCounts 
    AS 
    BEGIN 
        SET NOCOUNT ON 

        CREATE TABLE #TableCounts
        ( 
            TableName VARCHAR(500), 
            CountOf INT 
        ) 

        INSERT #TableCounts
            EXEC sp_msForEachTable 
                'SELECT PARSENAME(''?'', 1), 
                COUNT(*) FROM ? WITH (NOLOCK)' 

        SELECT TableName , CountOf 
            FROM #TableCounts
            ORDER BY TableName 

        DROP TABLE #TableCounts
    END
    GO
6
ответ дан 23 November 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: