【问题标题】:How to count rows for all existing tables in Azure Synapse SQL Pool?如何计算 Azure Synapse SQL 池中所有现有表的行数?
【发布时间】:2023-01-07 08:17:24
【问题描述】:
我想生成一个表,其中包含所有可用表的列表和每个表的行数。
| Table Name |
Number of rows |
| SCHEMA.TABLE_NAME1 |
30 |
| SCHEMA.TABLE_NAME2 |
40 |
我使用了以下查询:
select schema_name(tab.schema_id) + '.' + tab.name as [table],
sum(part.rows) as [rows]
from sys.tables as tab
inner join sys.partitions as part
on tab.object_id = part.object_id
where part.index_id IN (1, 0) -- 0 - table without PK, 1 table with PK
group by schema_name(tab.schema_id) + '.' + tab.name
order by sum(part.rows) desc
但不幸的是,出于某种原因,所有超过 1000 行的表的行数都是 1000。
还有其他方法吗?
【问题讨论】:
标签:
azure
count
azure-synapse
azure-sql-pool
【解决方案1】:
您正在使用的查询也为我提供了错误的结果。由于某种原因,行sys.partitions 中的列在创建表时的值为 1000(即使表是空的)。
还有其他方法吗?
-
作为替代方案,我尝试使用以下查询。我创建了一个名为#rows_for_tables 的临时表,用于存储我们的结果。
-
然后我使用了 while 循环,我们循环遍历临时表 req_tables 中收集的表名,以计算 sys.tables 中可用的每个表的行数。
-
我们得到一个表名,将其插入rows_for_tables,更新行数计数字段表名对于该特定表并从#req_tables 中删除该表名(因为它已插入,我们不需要它)。
-
执行上述过程后,所需的结果将出现在#rows_for_tables临时表中。
总查询:
CREATE TABLE #rows_for_tables
(
table_name varchar(50),
no_of_rows int
)
select top(1000) name into #req_tables from sys.tables
declare @t_name varchar(50)
while exists (select * from #req_tables)
begin
select @t_name = (select top 1 name
from #req_tables
order by name asc)
insert into #rows_for_tables(table_name) values(@t_name)
exec('update #rows_for_tables set no_of_rows = (select count(*) from '+@t_name+') where table_name='''+@t_name+'''')
delete from #req_tables
where name = @t_name
end
select * from #rows_for_tables
输出:
【解决方案2】:
CREATE TABLE #temp_row_count
( row_num INT,
table_name VARCHAR(100),
row_count INT
)
INSERT INTO #temp_row_count
(row_num, table_name)
(SELECT
ROW_NUMBER() OVER(ORDER BY SCHEMA_NAME(tbl.schema_id)+'.'+tbl.name ASC),
SCHEMA_NAME(tbl.schema_id)+'.'+tbl.name
FROM sys.tables AS tbl
WHERE SCHEMA_NAME(tbl.schema_id) = 'dbo')
DECLARE @Counter INT
DECLARE @Table VARCHAR(100)
SET @Counter = 1
WHILE @Counter <= (SELECT COUNT(*) FROM #temp_row_count)
BEGIN
SET @Table = (SELECT table_name FROM #temp_row_count WHERE row_num = @Counter)
EXEC('UPDATE #temp_row_count SET row_count = (SELECT COUNT(*) FROM '+ @Table +') WHERE row_num='''+ @Counter +'''')
SET @Counter = @Counter + 1
END
SELECT * FROM #temp_row_count
DROP TABLE #temp_row_count