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
전체 데이터베이스의 총 행 수에 대한 단일 값을 얻습니다.
시간과 자원을 전달하려면 3 백만 행 테이블을 계산하는 데 걸리는 시간이 필요합니다. Kendal Van Dyke의 SQL SERVER Central별로 시도하십시오.
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가 계속 작동하지만 향후 버전의 SQL Server에서 sysindexes가 제거 될 수 있으므로 다음과 같이 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에서 작동하며 저장된 proc가 필요하지 않습니다.
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)
크레딧 .
이것은 내가 생각하는 다른 것보다 나아 보입니다.
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'
산출:
SQL Server 2005 이상은 행 수 등을 포함하여 테이블 크기를 보여주는 멋진 보고서를 제공합니다. 표준 보고서에 있으며 디스크 사용 테이블입니다.
프로그래밍 방식으로 다음과 같은 훌륭한 솔루션이 있습니다. http://www.sqlservercentral.com/articles/T-SQL/67624/
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
SELECT COUNT(*) FROM TABLENAME
리소스를 많이 사용하는 작업이므로를 사용하지 마십시오 . 하나는 사용해야합니다 SQL 서버 동적 관리 뷰 또는 시스템 카탈로그를 데이터베이스의 모든 테이블에 대한 행 수의 정보를 얻을 수 있습니다.
Frederik의 솔루션을 약간 변경했습니다. 데이터 및 인덱스 크기도 포함하는 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
information_schema.tables보기에서 모든 행을 선택하고 해당보기에서 리턴 된 각 항목에 대해 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 접근 방식입니다.
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
).
이것은 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
'IT story' 카테고리의 다른 글
현재 시간을 datetime으로 얻는 방법 (0) | 2020.04.12 |
---|---|
type =“number”를 양수로만 만드는 방법 (0) | 2020.04.12 |
면접 질문 : 한 문자열이 다른 문자열의 회전인지 확인 (0) | 2020.04.12 |
파이썬의 무한 해시가 왜 π의 자릿수를 갖는가? (0) | 2020.04.12 |
matplotlib 범례 마커는 한 번만 (0) | 2020.04.12 |