[sql-server] 데이터베이스의 각 테이블에있는 레코드 수를 나열하는 쿼리

데이터베이스에서 각 테이블의 행 수를 나열하는 방법 일부

select count(*) from table1
select count(*) from table2
...
select count(*) from tableN

나는 해결책을 게시 할 것이지만 다른 접근법은 환영합니다.



답변

SQL Server 2005 이상을 사용하는 경우 다음을 사용할 수도 있습니다.

SELECT
    t.NAME AS TableName,
    i.name as indexName,
    p.[Rows],
    sum(a.total_pages) as TotalPages,
    sum(a.used_pages) as UsedPages,
    sum(a.data_pages) as DataPages,
    (sum(a.total_pages) * 8) / 1024 as TotalSpaceMB,
    (sum(a.used_pages) * 8) / 1024 as UsedSpaceMB,
    (sum(a.data_pages) * 8) / 1024 as DataSpaceMB
FROM
    sys.tables t
INNER JOIN
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE
    t.NAME NOT LIKE 'dt%' AND
    i.OBJECT_ID > 255 AND
    i.index_id <= 1
GROUP BY
    t.NAME, i.object_id, i.index_id, i.name, p.[Rows]
ORDER BY
    object_name(i.object_id) 

제 생각에는 sp_msforeachtable출력 보다 처리하기가 더 쉽습니다 .


답변

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=21021 에서 찾은 스 니펫 은 다음과 같습니다.

select t.name TableName, i.rows Records
from sysobjects t, sysindexes i
where t.xtype = 'U' and i.id = t.id and i.indid in (0,1)
order by TableName;


답변

SQL Management Studio에서 해당 정보를 얻으려면 데이터베이스를 마우스 오른쪽 단추로 클릭 한 후 보고서-> 표준 보고서-> 테이블 별 디스크 사용량을 선택하십시오.


답변

SELECT
    T.NAME AS 'TABLE NAME',
    P.[ROWS] AS 'NO OF ROWS'
FROM SYS.TABLES T
INNER JOIN  SYS.PARTITIONS P ON T.OBJECT_ID=P.OBJECT_ID;


답변

여기에서 볼 수 있듯이 메타 데이터 테이블을 사용하는 메서드는 추정값 만 반환하는 올바른 카운트를 반환합니다.

    CREATE PROCEDURE ListTableRowCounts
    AS
    BEGIN
        SET NOCOUNT ON

        CREATE TABLE #TableCounts
        (
            TableName VARCHAR(500),
            CountOf INT
        )

        INSERT #TableCounts
            EXEC sp_msForEachTable
                'SELECT PARSENAME(''?'', 1),
                COUNT(*) FROM ? WITH (NOLOCK)'

        SELECT TableName , CountOf
            FROM #TableCounts
            ORDER BY TableName

        DROP TABLE #TableCounts
    END
    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 관리 스튜디오는이를 수행하는 방법에 대한 힌트를 제공합니다. 이 작업을 수행,

  1. SQL Server 추적을 시작하고 수행중인 활동 (독립적이 아닌 경우 로그인 ID로 필터링하고 응용 프로그램 이름을 Microsoft SQL Server Management Studio로 설정)을 열고 추적을 일시 중지하고 지금까지 기록한 모든 결과를 삭제하십시오.
  2. 그런 다음 테이블을 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 속성을 선택하십시오.
  3. 추적을 다시 시작하십시오.
  4. 이제 SQL Server Management Studio에서 왼쪽의 저장소 속성 항목을 선택하십시오.

추적을 일시 정지하고 Microsoft가 TSQL을 생성하는 것을 살펴보십시오.

아마도 마지막 쿼리에서 다음으로 시작하는 문장을 볼 수 있습니다 exec sp_executesql N'SELECT

실행 된 코드를 Visual Studio에 복사하면이 코드가 Microsoft 엔지니어가 속성 창을 채우는 데 사용하는 모든 데이터를 생성한다는 것을 알 수 있습니다.

해당 쿼리를 약간 수정하면 다음과 같은 결과가 나타납니다.

SELECT
SCHEMA_NAME(tbl.schema_id)+'.'+tbl.name as [table], --> something I added
p.partition_number AS [PartitionNumber],
prv.value AS [RightBoundaryValue],
 fg.name AS [FileGroupName],
CAST(pf.boundary_value_on_right AS int) AS [RangeType],
CAST(p.rows AS float) AS [RowCount],
p.data_compression AS [DataCompression]
FROM sys.tables AS tbl
INNER JOIN sys.indexes AS idx ON idx.object_id = tbl.object_id and idx.index_id < 2
INNER JOIN sys.partitions AS p ON p.object_id=CAST(tbl.object_id AS int) AND p.index_id=idx.index_id
LEFT OUTER JOIN sys.destination_data_spaces AS dds ON dds.partition_scheme_id = idx.data_space_id and dds.destination_id = p.partition_number
LEFT OUTER JOIN sys.partition_schemes AS ps ON ps.data_space_id = idx.data_space_id
LEFT OUTER JOIN sys.partition_range_values AS prv ON prv.boundary_id = p.partition_number and prv.function_id = ps.function_id
LEFT OUTER JOIN sys.filegroups AS fg ON fg.data_space_id = dds.data_space_id or fg.data_space_id = idx.data_space_id
LEFT OUTER JOIN sys.partition_functions AS pf ON  pf.function_id = prv.function_id

이제 쿼리가 완벽하지 않고 다른 질문에 맞게 업데이트 할 수 있습니다. 요점은 Microsoft에 대한 지식을 사용하여 관심있는 데이터를 실행하여 필요한 대부분의 질문에 도달 할 수 있다는 것입니다. 프로파일 러를 사용하여 생성 된 TSQL

MS 엔지니어가 SQL 서버의 작동 방식을 알고 있다고 생각하고 사용중인 SSMS의 버전을 사용하여 작업 할 수있는 모든 항목에서 작동하는 TSQL을 생성한다고 생각하고 싶습니다. 미래.

그리고 그냥 복사하지 말고 이해하려고 노력하십시오. 그렇지 않으면 잘못된 해결책으로 끝날 수 있습니다.

월터