[SQL] 어떻게 SQL Server 데이터베이스의 모든 테이블에 대한 행 수를 가져 오기 위해 [중복]
SQL어떻게 SQL Server 데이터베이스의 모든 테이블에 대한 행 수를 가져 오기 위해 [중복]
나는 주어진 데이터베이스의 모든 테이블에서 모든 데이터 (즉, 행 수)이 있으면 결정하는 데 사용할 수있는 SQL 스크립트를 찾고 있어요.
아이디어는 기존의 모든 행 (데이터베이스의에)가있는 경우에 데이터베이스를 다시 화신입니다.
말한 데이터베이스의 존재는 마이크로 소프트 SQL 서버입니다.
사람은 샘플 스크립트를 제안 할 수 있을까요?
해결법
-
==============================
1.다음 SQL은 당신에게 데이터베이스의 모든 테이블의 행 수를 얻을 것이다 :
다음 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
당신에게 전체 데이터베이스에있는 행의 총 수에 대한 단일 값을 얻을 것이다.
-
==============================
2.당신은 (*) 당신의 3million 행 테이블을 계산하는 데 걸리는 시간과 자원을 패스에 의해합니다. 켄달 반 다이크에 의해 SQL Server 중앙 당이보십시오.
당신은 (*) 당신의 3million 행 테이블을 계산하는 데 걸리는 시간과 자원을 패스에 의해합니다. 켄달 반 다이크에 의해 SQL Server 중앙 당이보십시오.
sysindexes의 사용 행 카운트 당신은 SQL 2000을 사용하는 경우 당신은 sysindexes의 너무 좋아 사용해야합니다 :
-- 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을합니다 사용하고 있지만, 마이크로 소프트는 sysindexes에 그래서 당신이 그렇게 좋아, 대신 DMV에 사용해야 좋은 연습과 같은 SQL Server의 이후 버전에서 제거 될 수 있음을 조언하는 경우 :
-- 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
-
==============================
3.저장 발동을 필요로하지 않습니다, 푸른에서 작동합니다.
저장 발동을 필요로하지 않습니다, 푸른에서 작동합니다.
SELECT t.name, s.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%' AND s.index_id IN (0,1)
신용.
-
==============================
4.내가 생각하는 다른 사람보다 더 나은이 하나 개 보인다.
내가 생각하는 다른 사람보다 더 나은이 하나 개 보인다.
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
-
==============================
5.짧고 달다
짧고 달다
sp_MSForEachTable 'DECLARE @t AS VARCHAR(MAX); SELECT @t = CAST(COUNT(1) as VARCHAR(MAX)) + CHAR(9) + CHAR(9) + ''?'' FROM ? ; PRINT @t'
산출:
-
==============================
6.그것은 표준 보고서에의 등 행 수를 포함하여 - - 나중에 SQL Server 2005 또는 테이블의 크기를 보여주는 아주 좋은 보고서를 제공하고이 표에 의한 디스크의 사용이다.
그것은 표준 보고서에의 등 행 수를 포함하여 - - 나중에 SQL Server 2005 또는 테이블의 크기를 보여주는 아주 좋은 보고서를 제공하고이 표에 의한 디스크의 사용이다.
프로그래밍, 멋진 솔루션에서이있다 : http://www.sqlservercentral.com/articles/T-SQL/67624/
-
==============================
7.
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
-
==============================
8.즉 자원 집약적 인 작업이기 때문에, TABLENAME FROM SELECT COUNT (*)를 사용하지 마십시오. 하나는 데이터베이스의 모든 테이블에 대한 행 수의 정보를 얻기 위해 SQL 서버 동적 관리 뷰 또는 시스템 카탈로그를 사용해야합니다.
즉 자원 집약적 인 작업이기 때문에, TABLENAME FROM SELECT COUNT (*)를 사용하지 마십시오. 하나는 데이터베이스의 모든 테이블에 대한 행 수의 정보를 얻기 위해 SQL 서버 동적 관리 뷰 또는 시스템 카탈로그를 사용해야합니다.
-
==============================
9.나는 프레데릭의 솔루션에 작은 변화를 만들 것입니다. 또한 데이터와 인덱스 크기가 포함됩니다 sp_spaceused를 시스템 저장 프로 시저를 사용합니다.
나는 프레데릭의 솔루션에 작은 변화를 만들 것입니다. 또한 데이터와 인덱스 크기가 포함됩니다 sp_spaceused를 시스템 저장 프로 시저를 사용합니다.
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
-
==============================
10.INFORMATION_SCHEMA.TABLES에서 모든 행을 선택보고, 해당 뷰에서 반환 된 각 항목에 대해 카운트 (*) 문을 실행합니다.
INFORMATION_SCHEMA.TABLES에서 모든 행을 선택보고, 해당 뷰에서 반환 된 각 항목에 대해 카운트 (*) 문을 실행합니다.
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
-
==============================
11.다음은 또한 당신에게뿐만 아니라 스키마를 제공하는 동적 SQL 접근 방법이다 :
다음은 또한 당신에게뿐만 아니라 스키마를 제공하는 동적 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)
필요한 경우이 인스턴스의 모든 데이터베이스를 통해 실행하려면이 옵션을 확장 할 사소한 것 (하려면 sys.databases에 가입).
-
==============================
12.이것은 내가 종류를 사용하고 내가 필요로하는 결과를 얻을 수있는 "TEST"임시 테이블에 결과를두고 SQL 2008 내가 좋아하는 솔루션입니다 :
이것은 내가 종류를 사용하고 내가 필요로하는 결과를 얻을 수있는 "TEST"임시 테이블에 결과를두고 SQL 2008 내가 좋아하는 솔루션입니다 :
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%')
-
==============================
13.
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
from https://stackoverflow.com/questions/2221555/how-to-fetch-the-row-count-for-all-tables-in-a-sql-server-database by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 파이썬에서 SQL 주입에 대해 보호 (0) | 2020.04.09 |
---|---|
[SQL] 세계의 모든 주소가 일반적인 거리 주소의 데이터베이스 설계인가? (0) | 2020.04.08 |
[SQL] SQL 서버 쿼리는 데이터 유형, NOT NULL 및 PRIMARY KEY 제약 조건과 함께 테이블에 열 목록을 얻을 수 있습니다 (0) | 2020.04.08 |
[SQL] 쿼리 SQL Server가 그룹의 마지막 행을 찾기 (0) | 2020.04.08 |
[SQL] 시간을 줄이기 위해 선택 MySQL을 다시 쓰기 디스크에 TMP를 작성 (0) | 2020.04.08 |