programing

SQL SERVER 데이터베이스의 모든 테이블에 대한 행 수를 가져오는 방법

padding 2023. 4. 18. 21:48
반응형

SQL SERVER 데이터베이스의 모든 테이블에 대한 행 수를 가져오는 방법

특정 데이터베이스의 테이블에 데이터(행 수 등)가 있는지 확인하기 위해 사용할 수 있는 SQL 스크립트를 검색하고 있습니다.

즉, (데이터베이스 중 하나에) 행이 존재하는 경우 데이터베이스를 다시 통합하는 것입니다.

거론되고 있는 데이터베이스는Microsoft SQL SERVER.

누가 샘플 대본 좀 제안해 주시겠어요?

다음 SQL은 데이터베이스 내의 모든 테이블의 행 수를 가져옵니다.

CREATE TABLE #counts
(
    table_name varchar(255),
    row_count int
)

EXEC sp_MSForEachTable @command1='INSERT #counts (table_name, row_count) SELECT ''?'', COUNT(*) FROM ?'
SELECT table_name, row_count FROM #counts ORDER BY table_name, row_count DESC
DROP TABLE #counts

출력은 테이블과 그 행 수 리스트가 됩니다.

데이터베이스 전체에서 행의 합계수를 구하는 경우는, 다음과 같이 추가합니다.

SELECT SUM(row_count) AS total_row_count FROM #counts

그러면 전체 데이터베이스의 총 행 수에 대한 단일 값이 표시됩니다.

300만 개의 행 테이블을 세는 데 걸리는 시간과 자원을 넘길 필요가 있습니다(*).이것은 Kendal Van Dyke의 SQL SERVER Central별로 시험해 보십시오.


행 수 sysindex를 사용하는 SQL 2000을 사용하는 경우 다음과 같은 sysindex를 사용해야 합니다.

-- Shows all user tables and row counts for the current database 
-- Remove OBJECTPROPERTY function call to include system objects 
SELECT o.NAME,
  i.rowcnt 
FROM sysindexes AS i
  INNER JOIN sysobjects AS o ON i.id = o.id 
WHERE i.indid < 2  AND OBJECTPROPERTY(o.id, 'IsMSShipped') = 0
ORDER BY o.NAME

SQL 2005 또는 2008을 사용하는 경우 sysindexes 쿼리는 계속 기능하지만 Microsoft는 sysindexes가 향후 버전의 SQL Server에서 삭제될 수 있으므로 다음과 같이 DMV를 사용하는 것이 좋습니다.

-- Shows all user tables and row counts for the current database 
-- Remove is_ms_shipped = 0 check to include system objects 
-- i.index_id < 2 indicates clustered index (1) or hash table (0) 
SELECT o.name,
  ddps.row_count 
FROM sys.indexes AS i
  INNER JOIN sys.objects AS o ON i.OBJECT_ID = o.OBJECT_ID
  INNER JOIN sys.dm_db_partition_stats AS ddps ON i.OBJECT_ID = ddps.OBJECT_ID
  AND i.index_id = ddps.index_id 
WHERE i.index_id < 2  AND o.is_ms_shipped = 0 ORDER BY o.NAME 

Azure에서 작동하며 저장된 프로세서가 필요하지 않습니다.

SELECT t.name       AS table_name
       ,s.row_count AS row_count
FROM   sys.tables t
JOIN   sys.dm_db_partition_stats s
  ON t.OBJECT_ID = s.OBJECT_ID
 AND t.type_desc = 'USER_TABLE'
 AND t.name NOT LIKE '%dss%' --Exclude tables created by SQL Data Sync for Azure.
 AND s.index_id IN (0, 1)
ORDER  BY table_name;

신용.

이건 내가 생각하는 다른 것보다 더 좋아 보인다.

USE  [enter your db name here]
GO

SELECT      SCHEMA_NAME(A.schema_id) + '.' +
        --A.Name, SUM(B.rows) AS 'RowCount'  Use AVG instead of SUM
          A.Name, AVG(B.rows) AS 'RowCount'
FROM        sys.objects A
INNER JOIN sys.partitions B ON A.object_id = B.object_id
WHERE       A.type = 'U'
GROUP BY    A.schema_id, A.Name
GO

짧고 달콤한

sp_MSForEachTable 'DECLARE @t AS VARCHAR(MAX); 
SELECT @t = CAST(COUNT(1) as VARCHAR(MAX)) 
+ CHAR(9) + CHAR(9) + ''?'' FROM ? ; PRINT @t'

출력:

여기에 이미지 설명 입력

SELECT 
    sc.name +'.'+ ta.name TableName, SUM(pa.rows) RowCnt
FROM 
    sys.tables ta
INNER JOIN sys.partitions pa
    ON pa.OBJECT_ID = ta.OBJECT_ID
INNER JOIN sys.schemas sc
    ON ta.schema_id = sc.schema_id
WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0)
GROUP BY sc.name,ta.name
ORDER BY SUM(pa.rows) DESC

SQL Server 2005 이후에서는 행 수 등 테이블 크기를 보여주는 매우 좋은 보고서가 제공됩니다.Standard Reports(표준 보고서)에 기재되어 있습니다.또, 「Disc Usage by Table(테이블별 디스크 사용 상황)」이라고 기재되어 있습니다.

프로그램적으로는 http://www.sqlservercentral.com/articles/T-SQL/67624/에 좋은 솔루션이 있습니다.

사용하지 않다SELECT COUNT(*) FROM TABLENAME자원 부하가 높은 작업이기 때문입니다.데이터베이스 내의 모든 테이블의 행 수 정보를 가져오려면 SQL Server 동적 관리 보기 또는 시스템 카탈로그를 사용해야 합니다.

프레데릭의 해결책에 작은 변화를 줄 거야sp_spaceused system stored procedure를 사용합니다.이 프로시저는 데이터와 인덱스 사이즈도 포함합니다.


declare c_tables cursor fast_forward for 
select table_name from information_schema.tables 

open c_tables 
declare @tablename varchar(255) 
declare @stmt nvarchar(2000) 
declare @rowcount int 
fetch next from c_tables into @tablename 

while @@fetch_status = 0 
begin 

    select @stmt = 'sp_spaceused ' + @tablename 

    exec sp_executesql @stmt

    fetch next from c_tables into @tablename 

end 

close c_tables 
deallocate c_tables 

다음은 스키마도 제공하는 동적 SQL 접근법입니다.

DECLARE @sql nvarchar(MAX)

SELECT
    @sql = COALESCE(@sql + ' UNION ALL ', '') +
        'SELECT
            ''' + s.name + ''' AS ''Schema'',
            ''' + t.name + ''' AS ''Table'',
            COUNT(*) AS Count
            FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name)
    FROM sys.schemas s
    INNER JOIN sys.tables t ON t.schema_id = s.schema_id
    ORDER BY
        s.name,
        t.name

EXEC(@sql)

경우 내의 inin in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in)로 일입니다.sys.databases를 참조해 주세요.

information_syslog.syslog 뷰에서 모든 행을 선택하고 해당 뷰에서 반환된 각 엔트리에 대해 count) 문을 발행합니다.

declare c_tables cursor fast_forward for
select table_name from information_schema.tables

open c_tables
declare @tablename varchar(255)
declare @stmt nvarchar(2000)
declare @rowcount int
fetch next from c_tables into @tablename

while @@fetch_status = 0
begin

    select @stmt = 'select @rowcount = count(*) from ' + @tablename

    exec sp_executesql @stmt, N'@rowcount int output', @rowcount=@rowcount OUTPUT

    print N'table: ' + @tablename + ' has ' + convert(nvarchar(1000),@rowcount) + ' rows'

    fetch next from c_tables into @tablename

end

close c_tables
deallocate c_tables

이것은 SQL 2008에서 가장 마음에 드는 솔루션입니다.이 솔루션은 결과를 "TEST" 임시 테이블로 정리하여 필요한 결과를 얻을 수 있습니다.

SET NOCOUNT ON 
DBCC UPDATEUSAGE(0) 
DROP TABLE #t;
CREATE TABLE #t 
( 
[name] NVARCHAR(128),
[rows] CHAR(11),
reserved VARCHAR(18), 
data VARCHAR(18), 
index_size VARCHAR(18),
unused VARCHAR(18)
) ;
INSERT #t EXEC sp_msForEachTable 'EXEC sp_spaceused ''?''' 
SELECT * INTO TEST FROM #t;
DROP TABLE #t;
SELECT  name, [rows], reserved, data, index_size, unused FROM TEST \
WHERE ([rows] > 0) AND (name LIKE 'XXX%')
    SELECT
          SUM(sdmvPTNS.row_count) AS [DBRows]
    FROM
          sys.objects AS sOBJ
          INNER JOIN sys.dm_db_partition_stats AS sdmvPTNS
                ON sOBJ.object_id = sdmvPTNS.object_id
    WHERE 
          sOBJ.type = 'U'
          AND sOBJ.is_ms_shipped = 0
          AND sdmvPTNS.index_id < 2
    GO

언급URL : https://stackoverflow.com/questions/2221555/how-to-fetch-the-row-count-for-all-tables-in-a-sql-server-database

반응형