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

Откуда:
Сообщений: 401
Всем привет.
Подскажите пожалуйста, у меня есть 2 таблицы A и B
в таблице A содержится 300млн записей
в таблице B содержится 800млн записей
на обеих таблицах есть ключ по одному полю uniqueidentifier
запускаю count на обеих таблицах (по очереди):
SELECT COUNT(*) 
FROM A

получаю результат за 10 секунд
Выполняю :
SELECT COUNT(*) 
FROM B

получаю результат за 30 минут

Обе таблицы находятся в разных базах и я предполагаю, что связано это с тем, что одна база A хранится физически на более быстрых носителях (HDD), чем база B

Скажите пожалуйста с чем это может быть связано, что я упускаю?
12 июн 19, 11:26    [21907221]     Ответить | Цитировать Сообщить модератору
 Re: количество записей в таблице count  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36970
Кол-во записей можно узнать гораздо быстрее.

А мерять скорость скана без учета объема в байтах как-то странно. И не следить за статусом сессии и ожиданиями в течение 30 минут тоже.

Сообщение было отредактировано: 12 июн 19, 11:35
12 июн 19, 11:34    [21907229]     Ответить | Цитировать Сообщить модератору
 Re: количество записей в таблице count  [new]
Sandist
Member

Откуда:
Сообщений: 401
Гавриленко Сергей Алексеевич,

подскажите пожалуйста как я должен был это проверить? или если есть статься или пост где я могу про это узнать больше?
12 июн 19, 11:38    [21907233]     Ответить | Цитировать Сообщить модератору
 Re: количество записей в таблице count  [new]
Alexander Us
Member

Откуда:
Сообщений: 1130
Sandist,
примерное количество записей:
+

 
CREATE view [dbo].[v_statistics_spaceusage_tables]

as

SELECT 

a3.name AS [schema_name],

a2.name AS [table_name],

a1.rows as row_count,

(a1.reserved + ISNULL(a4.reserved,0))* 8 AS reserved_kb,

a1.data * 8 AS data_kb,

(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_kb,

cast(case when (a1.reserved + ISNULL(a4.reserved,0))=0 then NULL else ((CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END)*100.0) / (a1.reserved + ISNULL(a4.reserved,0)) end as decimal(5,2)) as index_pct,

(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_kb,

cast(case when (a1.reserved + ISNULL(a4.reserved,0)) = 0 then NULL else ((CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END)*100.0 / (a1.reserved + ISNULL(a4.reserved,0))) end as decimal(5,2)) AS unused_pct,

IDENT_CURRENT('[' + db_name() + '].['+ a3.name + '].[' + a2.name + ']') last_identity,

(select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc where tc.TABLE_SCHEMA = a3.name and tc.TABLE_NAME=a2.name and CONSTRAINT_TYPE = 'primary key' ) has_pk,

(select count(*) from INFORMATION_SCHEMA.COLUMNS           tc where tc.TABLE_SCHEMA = a3.name and tc.TABLE_NAME=a2.name and tc.DATA_TYPE in('timestamp')) has_tstmp,

st.is_published,

--case st.lob_data_space_id when 0 then 'N' else 'J' end has_lobs,
(select count(*) from sys.columns sc where sc.object_id=st.object_id) cols,
(select count(*) from sys.columns sc where sc.object_id=st.object_id and (sc.system_type_id in(35,99,34) or (sc.system_type_id in(167,231,165,241) and max_length=-1))) lobs,
st.large_value_types_out_of_row as is_oor,

cast(case when a1.rows=0 then null else a1.data * 8.0 / a1.rows end as decimal(16,4)) data_kb_per_row,
cast(case when a1.rows=0 then null else ((CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8) * 8.0 / a1.rows end as decimal(16,4)) index_kb_per_row
 
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)
INNER JOIN sys.tables       st on st.object_id=a1.object_id
WHERE a2.type <> N'S' and a2.type <> N'IT'
and st.is_ms_shipped=0
GO

12 июн 19, 15:45    [21907325]     Ответить | Цитировать Сообщить модератору
 Re: количество записей в таблице count  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36970
Sandist,

sp_spaceused
sys.dm_os_waiting_tasks
12 июн 19, 23:49    [21907519]     Ответить | Цитировать Сообщить модератору
 Re: количество записей в таблице count  [new]
uaggster
Member

Откуда:
Сообщений: 827
Sandist, почитайте вот эту статью на хабре: https://habr.com/ru/post/271797/
Писал один из завсегдатаев этого форума.
... к сожалению, сейчас редко пишущих сюда.
13 июн 19, 08:23    [21907624]     Ответить | Цитировать Сообщить модератору
 Re: количество записей в таблице count  [new]
982183
Member

Откуда: VL
Сообщений: 3352
А в sysindexes.Rows разве не количество строк хранится?
13 июн 19, 08:47    [21907640]     Ответить | Цитировать Сообщить модератору
 Re: количество записей в таблице count  [new]
Alexander Us
Member

Откуда:
Сообщений: 1130
Alexander Us
Sandist,
примерное количество записей:
+

 
CREATE view [dbo].[v_statistics_spaceusage_tables]

as

SELECT 

a3.name AS [schema_name],

a2.name AS [table_name],

a1.rows as row_count,

(a1.reserved + ISNULL(a4.reserved,0))* 8 AS reserved_kb,

a1.data * 8 AS data_kb,

(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_kb,

cast(case when (a1.reserved + ISNULL(a4.reserved,0))=0 then NULL else ((CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END)*100.0) / (a1.reserved + ISNULL(a4.reserved,0)) end as decimal(5,2)) as index_pct,

(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_kb,

cast(case when (a1.reserved + ISNULL(a4.reserved,0)) = 0 then NULL else ((CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END)*100.0 / (a1.reserved + ISNULL(a4.reserved,0))) end as decimal(5,2)) AS unused_pct,

IDENT_CURRENT('[' + db_name() + '].['+ a3.name + '].[' + a2.name + ']') last_identity,

(select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc where tc.TABLE_SCHEMA = a3.name and tc.TABLE_NAME=a2.name and CONSTRAINT_TYPE = 'primary key' ) has_pk,

(select count(*) from INFORMATION_SCHEMA.COLUMNS           tc where tc.TABLE_SCHEMA = a3.name and tc.TABLE_NAME=a2.name and tc.DATA_TYPE in('timestamp')) has_tstmp,

st.is_published,

--case st.lob_data_space_id when 0 then 'N' else 'J' end has_lobs,
(select count(*) from sys.columns sc where sc.object_id=st.object_id) cols,
(select count(*) from sys.columns sc where sc.object_id=st.object_id and (sc.system_type_id in(35,99,34) or (sc.system_type_id in(167,231,165,241) and max_length=-1))) lobs,
st.large_value_types_out_of_row as is_oor,

cast(case when a1.rows=0 then null else a1.data * 8.0 / a1.rows end as decimal(16,4)) data_kb_per_row,
cast(case when a1.rows=0 then null else ((CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8) * 8.0 / a1.rows end as decimal(16,4)) index_kb_per_row
 
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)
INNER JOIN sys.tables       st on st.object_id=a1.object_id
WHERE a2.type <> N'S' and a2.type <> N'IT'
and st.is_ms_shipped=0
GO



Предложенный выше вид v_statistics_spaceusage_tables допилен из стандартного SSMS отчета "Disk Usage by Top Tables"
Картинка с другого сайта.

К сообщению приложен файл. Размер - 24Kb
13 июн 19, 11:47    [21907785]     Ответить | Цитировать Сообщить модератору
 Re: количество записей в таблице count  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1238
Sandist,

SELECT  t.name TableName,  s.name AS [schema], p.rows Records
from sys.objects t     -- with (nolock)
JOIN sys.schemas s 
	ON t.schema_id=s.schema_id
JOIN sys.partitions  p 
	ON p.object_id = t.object_id 
JOIN sys.indexes i 
	ON i.index_id=p.index_id AND t.object_id=i.object_id
where 
t.type = 'U' and i.type_desc in ('CLUSTERED','HEAP')  
-- order by 3 desc
;

Не идеально
раотатет если верна статистика
и для партицированных таблиц не пашет
но зато оч.быстро показывает кол-во
14 июн 19, 17:54    [21908921]     Ответить | Цитировать Сообщить модератору
 Re: количество записей в таблице count  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Я постоянно теряю эти скрипты, поэтому, когда опять, на очередном BI/ETL проекте, надо быстро считать количество записей в куче таблиц, я поступаю так:
- запускаю профайлер
- правой кнопкой мыши по имени базы => Reports => Standard Reports => Disk usage by Table
- в профайлере перехватываю текст запроса, копирую его
- создаю VIEW disk_usage_by_table с текстом перехваченного запроса

Метод, конечно, для ленивых, но всегда под рукой :-)
25 июн 19, 10:46    [21914629]     Ответить | Цитировать Сообщить модератору
 Re: количество записей в таблице count  [new]
Владислав Колосов
Member

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

set statistics io, time on;
select count(*) from A;
select count(*) from B;
25 июн 19, 11:51    [21914700]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить