2010-02-08 3 views
1

Я ищу простой способ подсчета всех строк в одной базе данных SQL Server 2005/2008 (пропуская системные таблицы, конечно)? Я знаю, что могу использоватьПростой способ узнать, сколько строк в общей сложности хранится в базе данных SQL Server?

SELECT COUNT (COLUMN) FROM TABLE 

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

Есть ли один?

+0

Лучший способ сделать это - использовать встроенный отчет «Использование диска по верхним таблицам» –

ответ

3
SELECT SUM(row_count) 
    FROM sys.dm_db_partition_stats 
    WHERE index_id IN (0,1) 
    AND OBJECTPROPERTY([object_id], 'IsMsShipped') = 0; 

Это будет точным, за исключением, возможно, все строки, которые добавляются или удаляются в транзакции во время выполнения запроса. И это не будет иметь затраты на попадание отдельных таблиц.

Но, как я уже упоминал в другом комментарии, я не уверен, как это поможет вам определить, «сколько данных» содержится в вашей базе данных. Сколько строк, конечно, но если у меня 10 очков, каждая половина полна воды, и у вас есть 5 очков, каждый из которых полностью заполнен, у кого из нас больше воды?

+0

Спасибо, это похоже на самый простой запрос с наименьшим ударом. Я также предоставил некоторые моменты другим, которые предоставили одинаково хорошую информацию, но победитель мог быть только одним. – MadBoy

0

Вы можете запросить sysindexes, посмотрите на значение rowcnt для кластерного индекса для каждой таблицы. Но я точно не знаю, насколько это актуально.

С другой стороны, что-то вроде этого (на короткое время испытывают на небольшой тест-дб):

CREATE TABLE #TableRowCount (TableName NVARCHAR(128), RowCnt BIGINT) 
INSERT #TableRowCount (TableName, RowCnt) 
EXECUTE sp_msforeachtable 'SELECT "?", COUNT(*) FROM ?' 
SELECT SUM(RowCnt) AS TotalRowCount FROM #TableRowCount 
DROP TABLE #TableRowCount 
+0

Эта информация легко доступна в DMV - для выполнения курсора, выполняющего COUNT (*), может быть очень дорого работать против каждой отдельной таблицы , Также обратите внимание, что sp_msforeachtable недокументирован и не поддерживается, поэтому его поведение может быть изменено (или вообще удалено) в любой момент. –

+0

Правда. У меня сложилось впечатление/предполагалось, что это более одноразовая задача, которая отражается в предложенном подходе. Согласитесь, что DMV - лучший способ пойти! – AdaTheDev

0

Я не уверен, если более ранняя версия MS SQL имеет стандарт SQL information_shema для словаря данных.

Вы можете сделать что-то вроде:

SELECT SUM(table_rows) 
FROM information_schema.tables 
WHERE table_schema = 'DATABASENAME' 
+0

К сожалению, это не в MS SQL :( – AdaTheDev

+0

Он доступен в MS SQL 2008. http://msdn.microsoft.com/en-us/library/ms186778.aspx – Yada

2

Try:

SELECT 
    [TableName] = so.name, 
    [RowCount] = MAX(si.rows) 
FROM 
    sysobjects AS so, 
    sysindexes AS si 
WHERE 
    so.xtype = 'U' 
    AND 
    si.id = OBJECT_ID(so.name) 
GROUP BY 
    so.name 
ORDER BY 
    2 DESC 

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

EDIT: Обратите внимание, что so.xtype - это типы пользователей, что делает предположение, что вы не хотите, чтобы материал системы и только «настоящие» данные.

EDIT2: отсутствие пламени Примечание: возможно, плохая идея запросить таблицу sysobjects :).

EDIT3: конкретно рассмотреть требования, а не ассоциативно не присоединяется :)

SELECT sum(mycount) from 
(SELECT 
    MAX(si.rows) AS mycount 
FROM 
    sysobjects AS so 
    join sysindexes AS si on si.id = OBJECT_ID(so.name) 

WHERE 
    so.xtype = 'U' 
GROUP BY 
    so.name 
) as mylist 
+0

Красиво представляет много дополнительной информации +1 для этого. – MadBoy

1

Мы знаем, что sp_spaceused, когда прошло имя таблицы, возвращает количество строк, поэтому мы можем проверить, что он делает - это запросов sys.dm_db_partition_stats - и скопировать его, чтобы получить это:

SELECT 
    SUM(ddps.row_count) TotalRows 
FROM 
    sys.indexes i 
    INNER JOIN sys.objects o ON i.OBJECT_ID = o.OBJECT_ID 
    INNER JOIN sys.dm_db_partition_stats ddps ON 
     o.OBJECT_ID = ddps.OBJECT_ID 
     AND i.index_id = ddps.index_id 
WHERE 
    i.index_id < 2 
    AND o.is_ms_shipped = 0 -- to exclude system tables 

Любопытный требование, хотя, я должен сказать ...

+0

Мне задали вопрос правление, так как власти хотели узнать, сколько данных мы храним в нашей базе данных. – MadBoy

+0

Количество строк, которые вы храните, очень мало говорит вам, «сколько данных» вы держите. Если одна таблица имеет 240 000 строк, это только одна колонка, а другая таблица имеет 1000 строк, но имеет 240 столбцов, сколько данных есть? –

+0

Я знаю это. Но правительственное агентство специально задало нам вопрос о количестве строк в нашей базе данных. Думаю, для сравнения их статистики это с другими финансовыми учреждениями. Если это правильный вопрос, это не моя проблема :-) – MadBoy

1

Это был мой ответ на аналогичный Qu estion today:

SQL Server 2005 или более поздняя версия дает довольно полезный отчет, показывающий размеры таблиц - включая количество строк и т. д. Это в стандартных отчетах - и это использование диска по таблице.

Программным, есть хорошее решение по адресу: http://www.sqlservercentral.com/articles/T-SQL/67624/

0

Выезд недокументированные хранимой процедуры sp_MSForEachTable. Используя его, вы можете запустить Count (*) для каждой таблицы в базе данных. Для Вашего конкретного вопроса:

EXEC sp_MSforeachtable 'SELECT ''?'', Count(*) as NumberOfRows FROM ?' 
+0

Он работает, хотя похоже, что он работает несколькими запросы, дающие мне много результатов, которые мне придется вручную добавить после. Другие представленные варианты кажутся более разумными. – MadBoy

+0

В дополнение к набору вместо номера, это действительно не эффективный способ решения проблемы, ИМХО. –

+0

Также см. Мои комментарии к @AdaTheDev. –

Смежные вопросы