【问题标题】: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
      

      【讨论】:

        猜你喜欢
        • 2022-06-28
        • 2021-09-19
        • 2021-12-01
        • 2021-09-05
        • 2021-06-06
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        相关资源
        最近更新 更多