powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / количество записей в таблице count
11 сообщений из 11, страница 1 из 1
количество записей в таблице count
    #39825685
Sandist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Подскажите пожалуйста, у меня есть 2 таблицы A и B
в таблице A содержится 300млн записей
в таблице B содержится 800млн записей
на обеих таблицах есть ключ по одному полю uniqueidentifier
запускаю count на обеих таблицах (по очереди):
Код: sql
1.
2.
SELECT COUNT(*) 
FROM A


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


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

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

Скажите пожалуйста с чем это может быть связано, что я упускаю?
...
Рейтинг: 0 / 0
количество записей в таблице count
    #39825692
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кол-во записей можно узнать гораздо быстрее.

А мерять скорость скана без учета объема в байтах как-то странно. И не следить за статусом сессии и ожиданиями в течение 30 минут тоже.
...
Рейтинг: 0 / 0
количество записей в таблице count
    #39825695
Sandist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

подскажите пожалуйста как я должен был это проверить? или если есть статься или пост где я могу про это узнать больше?
...
Рейтинг: 0 / 0
количество записей в таблице count
    #39825768
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist,
примерное количество записей:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
 
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


...
Рейтинг: 0 / 0
количество записей в таблице count
    #39825877
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist,

sp_spaceused
sys.dm_os_waiting_tasks
...
Рейтинг: 0 / 0
количество записей в таблице count
    #39825941
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sandist, почитайте вот эту статью на хабре: https://habr.com/ru/post/271797/
Писал один из завсегдатаев этого форума.
... к сожалению, сейчас редко пишущих сюда.
...
Рейтинг: 0 / 0
количество записей в таблице count
    #39825953
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в sysindexes.Rows разве не количество строк хранится?
...
Рейтинг: 0 / 0
количество записей в таблице count
    #39826045
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander UsSandist,
примерное количество записей:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
 
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"
...
Рейтинг: 0 / 0
количество записей в таблице count
    #39826723
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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
;


Не идеально
раотатет если верна статистика
и для партицированных таблиц не пашет
но зато оч.быстро показывает кол-во
...
Рейтинг: 0 / 0
количество записей в таблице count
    #39830217
Фотография Yuri Abele
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я постоянно теряю эти скрипты, поэтому, когда опять, на очередном BI/ETL проекте, надо быстро считать количество записей в куче таблиц, я поступаю так:
- запускаю профайлер
- правой кнопкой мыши по имени базы => Reports => Standard Reports => Disk usage by Table
- в профайлере перехватываю текст запроса, копирую его
- создаю VIEW disk_usage_by_table с текстом перехваченного запроса

Метод, конечно, для ленивых, но всегда под рукой :-)
...
Рейтинг: 0 / 0
количество записей в таблице count
    #39830260
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist,

Код: sql
1.
2.
3.
set statistics io, time on;
select count(*) from A;
select count(*) from B;
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / количество записей в таблице count
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]