Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как подсчитать количество записей во всех таблицах бд  [new]
FeeL86
Member

Откуда:
Сообщений: 171
Добрый день.
Уважаемые эксперты. Подскажите существует ли такое представление или запрос, с помощью которого можно получить выборку таблиц бд и количество записей в каждой. Спасибо.
21 окт 11, 10:01    [11476637]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
sys.sysindexes
Содержит по одной строке для каждого индекса и таблицы в текущей базе данных

	select 
		object_name(id) name
		, rows 
	from 
		sysindexes
	where 
		indid in (0, 1, 255)
21 окт 11, 10:08    [11476673]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
mike909
Member

Откуда:
Сообщений: 662
FeeL86,

Если у Вас SQL2k5 и выше, то можно верить следующему запросу:
select obj.[name], SUM(c.row_count)
from sys.objects as obj 
inner join sys.schemas as s on 
  obj.schema_id = s.schema_id
inner join sys.dm_db_partition_stats as c  on 
  c.object_id = obj.object_id 
WHERE (c.index_id in (0,1))
group by obj.[name] with rollup
Если нужны только таблицы, то sys.objects заменить на sys.tables
21 окт 11, 10:25    [11476766]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
FeeL86
Member

Откуда:
Сообщений: 171
HandKot спасибо огромное
21 окт 11, 10:26    [11476769]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
FeeL86
Member

Откуда:
Сообщений: 171
mike909 спасибо
21 окт 11, 10:36    [11476823]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
85sergu
Member

Откуда: Винница
Сообщений: 137
--Подсчет количества строк во всех таблицах БД SQL Server 
SELECT o.name, i.rowcnt FROM sysobjects o 
inner join sysindexes i ON i.id = o.id WHERE o.TYPE = 'u' and indid = 1
21 окт 11, 10:47    [11476888]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
bloger7791
Member

Откуда: Москва
Сообщений: 3
HandKot
sys.sysindexes
Содержит по одной строке для каждого индекса и таблицы в текущей базе данных

	select 
		object_name(id) name
		, rows 
	from 
		sysindexes
	where 
		indid in (0, 1, 255)


прикольный способ, не знал о таком
21 окт 11, 11:45    [11477376]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
только надо учитывать

БОЛ
sys.sysindexes (Transact-SQL)
Содержит по одной строке для каждого индекса и таблицы в текущей базе данных. XML-индексы в этом представлении не поддерживаются, а секционированные таблицы и индексы поддерживаются не полностью. Используйте вместо него представление каталога sys.indexes.

Важно!
Эта системная таблица SQL Server 2000 включена в СУБД как представление для обеспечения обратной совместимости.
21 окт 11, 11:52    [11477462]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
Dimais
Member

Откуда:
Сообщений: 227
	select 
		object_name(id) name
		, rows 
	from 
		sysindexes
	where 
		indid in (0, 1, 255)

Почему то обычный count и этот вариант дают разные результаты ... ???

Запрос делается через LinkedServer к серваку ...
Microsoft SQL Server 2000 - 8.00.2055 (Intel X86) Dec 16 2008 19:46:53 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
3 ноя 11, 12:00    [11545145]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
Adony
Member

Откуда: Москва
Сообщений: 1085
sp_spaceused прогоните
3 ноя 11, 12:06    [11545189]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
Dimais
Member

Откуда:
Сообщений: 227
Adony
sp_spaceused прогоните


Тоже врёт !
3 ноя 11, 12:13    [11545246]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dimais
Почему то обычный count и этот вариант дают разные результаты ... ???

Почему они должны давать одинаковый ?
3 ноя 11, 12:21    [11545310]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dimais
Adony
sp_spaceused прогоните


Тоже врёт !

Вы его с опцией updateusage запускали ?
3 ноя 11, 12:21    [11545317]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
Dimais
Member

Откуда:
Сообщений: 227
Glory
Вы его с опцией updateusage запускали ?


Ага !
3 ноя 11, 12:31    [11545399]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
Dimais
Member

Откуда:
Сообщений: 227
Glory
Почему они должны давать одинаковый ?


А то есть тут просто так спрашивают ... ? )))
3 ноя 11, 12:33    [11545421]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dimais
А то есть тут просто так спрашивают ... ? )))

Никто нигде не гарантировал, что столбец rows в sysindexes дает точное число записей в таблице
3 ноя 11, 12:57    [11545676]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
Dimais
Member

Откуда:
Сообщений: 227
Glory
Никто нигде не гарантировал, что столбец rows в sysindexes дает точное число записей в таблице

А есть ли точный вариант, который работает быстрее чем просто
select count(*)
3 ноя 11, 13:05    [11545751]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Кстати, интересный вопрос. А select count(*) может давать неточный результат? Например большая таблица, в которую в момент вычисления count(*) добавляют или удаляют записи?
3 ноя 11, 13:54    [11546127]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Dimais
Glory
Никто нигде не гарантировал, что столбец rows в sysindexes дает точное число записей в таблице

А есть ли точный вариант, который работает быстрее чем просто
select count(*)
Нет
Prolog
Кстати, интересный вопрос. А select count(*) может давать неточный результат? Например большая таблица, в которую в момент вычисления count(*) добавляют или удаляют записи?
Может, если поставить режим выдачи неточного результата (nolock)
3 ноя 11, 14:06    [11546221]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
Dimais
Member

Откуда:
Сообщений: 227
Prolog
Кстати, интересный вопрос. А select count(*) может давать неточный результат? Например большая таблица, в которую в момент вычисления count(*) добавляют или удаляют записи?

ну если read uncommited то да ...
3 ноя 11, 14:07    [11546229]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
read commited спасет мир.
Guest
Dimais
Prolog
Кстати, интересный вопрос. А select count(*) может давать неточный результат? Например большая таблица, в которую в момент вычисления count(*) добавляют или удаляют записи?

ну если read uncommited то да ...

вы не поверите, но даже read commited не поможет ;)



1. коннект

create table t(id int not null)

create clustered index id on t(id)


insert t(id)
select convert(int, checksum(newid()))
from sys.objects o1
cross join sys.objects o2


declare @c int
while 1=1
begin
	select @c  = count(*)
	from t
	print @c	
end	

2. коннект

while 1=1
update t
set id = checksum(newid())

смотрите и наслаждайтесь.
3 ноя 11, 15:35    [11546992]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
Users
Member

Откуда:
Сообщений: 341
sp_MSforeachtable @command1="EXEC sp_MStablespace [?]"

Я этим данным верю.
3 ноя 11, 15:49    [11547092]     Ответить | Цитировать Сообщить модератору
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
Glory
Member

Откуда:
Сообщений: 104751
Users
sp_MSforeachtable @command1="EXEC sp_MStablespace [?]"

Я этим данным верю.

 SELECT @rows = convert(int, rowcnt)  
  FROM dbo.sysindexes  
  WHERE indid < 2 and id = @id  
И чем этот запрос из процедуры лучше/правдивее ?
3 ноя 11, 15:52    [11547118]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как подсчитать количество записей во всех таблицах бд  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1838
Если профайлером посмотреть построение отчета "Использование диского места таблицей"
То получим такой запрос:
BEGIN TRY
	SELECT
	  (ROW_NUMBER() OVER(ORDER BY a3.name, a2.name))%2 AS l1,
	  a3.name      AS [schemaname],
	  a2.name      AS [tablename],
	  a1.rows      AS row_count,
	  (a1.reserved + ISNULL(a4.reserved, 0)) * 8 AS reserved,
	  a1.data * 8  AS DATA,
	  (
	      CASE 
	           WHEN (a1.used + ISNULL(a4.used, 0)) > a1.data THEN (a1.used + ISNULL(a4.used, 0)) 
	                - a1.data
	           ELSE 0
	      END
	  ) * 8        AS index_size,
	  (
	      CASE 
	           WHEN (a1.reserved + ISNULL(a4.reserved, 0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved, 0)) 
	                - a1.used
	           ELSE 0
	      END
	  ) * 8        AS unused
	FROM
	  (
	      SELECT
	        ps.object_id,
	        SUM(CASE WHEN (ps.index_id < 2) THEN row_count ELSE 0 END) AS [rows],
	        SUM(ps.reserved_page_count)  AS reserved,
	        SUM(
	            CASE 
	                 WHEN (ps.index_id < 2) THEN (
	                          ps.in_row_data_page_count + ps.lob_used_page_count 
	                          + ps.row_overflow_used_page_count
	                      )
	                 ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count)
	            END
	        )                            AS DATA,
	        SUM(ps.used_page_count)      AS USED
	      FROM
	        sys.dm_db_partition_stats       ps
	      GROUP BY
	        ps.object_id
	  )            AS a1
	  LEFT OUTER JOIN (
	           SELECT
	             it.parent_id,
	             SUM(ps.reserved_page_count) AS reserved,
	             SUM(ps.used_page_count) AS USED
	           FROM
	             sys.dm_db_partition_stats ps
	             INNER JOIN sys.internal_tables it
	               ON  (it.object_id = ps.object_id)
	           WHERE
	             it.internal_type IN (202, 204)
	           GROUP BY
	             it.parent_id
	       )       AS a4
	    ON  (a4.parent_id = a1.object_id)
	  INNER JOIN sys.all_objects a2
	    ON  (a1.object_id = a2.object_id)
	  INNER JOIN sys.schemas a3
	    ON  (a2.schema_id = a3.schema_id)
	WHERE
	  a2.type <> N'S' AND
	  a2.type <> N'IT'
	ORDER BY
	  a3.name,
	  a2.name
END TRY 
BEGIN CATCH
	SELECT
	  -100              AS l1,
	  1                 AS schemaname,
	  ERROR_NUMBER()    AS tablename,
	  ERROR_SEVERITY()  AS row_count,
	  ERROR_STATE()     AS reserved,
	  ERROR_MESSAGE()   AS DATA,
	  1                 AS index_size,
	  1                 AS unused
END CATCH
16 июл 14, 11:40    [16311123]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить