[sql-server] 데이터베이스의 모든 테이블 크기 가져 오기

상당히 큰 SQL Server 데이터베이스를 상속했습니다. 포함 된 데이터를 감안할 때 예상보다 많은 공간을 차지하는 것 같습니다.

각 테이블이 소비하는 디스크 공간을 쉽게 결정할 수있는 방법이 있습니까?



답변

SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
    CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
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
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    TotalSpaceMB DESC, t.Name


답변

당신이 사용하는 경우 SQL Server 관리 Studio (SSMS)을 대신 (쿼리 실행하는 내 경우에는 중복 행을 반환 ) 당신은 실행할 수있는 표준 보고서를

  1. 데이터베이스를 마우스 오른쪽 버튼으로 클릭하십시오
  2. 보고서> 표준 보고서> 테이블 별 디스크 사용량으로 이동하십시오.

참고 :이 기능이 제대로 작동하려면 데이터베이스 호환성 수준을 90 이상으로 설정해야합니다. http://msdn.microsoft.com/en-gb/library/bb510680.aspx 참조


답변

sp_spaceused는 테이블, 인덱싱 된 뷰 또는 전체 데이터베이스에서 사용하는 디스크 공간에 대한 정보를 얻을 수 있습니다.

예를 들면 다음과 같습니다.

USE MyDatabase; GO

EXEC sp_spaceused N'User.ContactInfo'; GO

ContactInfo 테이블의 디스크 사용량 정보를보고합니다.

한 번에 모든 테이블에이를 사용하려면 다음을 수행하십시오.

USE MyDatabase; GO

sp_msforeachtable 'EXEC sp_spaceused [?]' GO

SQL Server의 마우스 오른쪽 단추를 클릭 한 표준 보고서 기능 내에서 디스크 사용량을 얻을 수도 있습니다. 이 보고서에 액세스하려면 개체 탐색기의 서버 개체에서 데이터베이스 개체로 이동 한 다음 데이터베이스를 마우스 오른쪽 단추로 클릭하십시오. 나타나는 메뉴에서 보고서, 표준 보고서 및 “파티션 별 디스크 사용량 : [데이터베이스 이름]”을 선택하십시오.


답변

여기에 또 다른 방법 : 사용하여 SQL Server Management Studio를 에서 개체 탐색기 , 데이터베이스를 선택로 이동 테이블

여기에 이미지 설명을 입력하십시오

열기 개체 탐색기 정보를 (눌러 중 하나 F7을 하거나가는 보기 -> 개체 탐색기 정보 ). 개체 탐색기 세부 정보 페이지에서 열 머리글을 마우스 오른쪽 단추로 클릭하고 페이지에서 보려는 열을 활성화하십시오. 열별로 데이터를 정렬 할 수도 있습니다.

여기에 이미지 설명을 입력하십시오


답변

일부 검색 후 모든 테이블에 대한 정보를 얻는 쉬운 방법을 찾을 수 없었습니다. 데이터베이스에서 사용하는 모든 공간을 반환하는 sp_spaceused라는 편리한 저장 프로 시저가 있습니다. 테이블 이름이 제공되면 해당 테이블이 사용하는 공간을 리턴합니다. 그러나 열이 문자 값이므로 저장 프로 시저에서 반환 된 결과는 정렬 할 수 없습니다.

다음 스크립트는 내가 찾고있는 정보를 생성합니다.

create table #TableSize (
    Name varchar(255),
    [rows] int,
    reserved varchar(255),
    data varchar(255),
    index_size varchar(255),
    unused varchar(255))
create table #ConvertedSizes (
    Name varchar(255),
    [rows] int,
    reservedKb int,
    dataKb int,
    reservedIndexSize int,
    reservedUnused int)

EXEC sp_MSforeachtable @command1="insert into #TableSize
EXEC sp_spaceused '?'"
insert into #ConvertedSizes (Name, [rows], reservedKb, dataKb, reservedIndexSize, reservedUnused)
select name, [rows], 
SUBSTRING(reserved, 0, LEN(reserved)-2), 
SUBSTRING(data, 0, LEN(data)-2), 
SUBSTRING(index_size, 0, LEN(index_size)-2), 
SUBSTRING(unused, 0, LEN(unused)-2)
from #TableSize

select * from #ConvertedSizes
order by reservedKb desc

drop table #TableSize
drop table #ConvertedSizes


답변

 exec  sp_spaceused N'dbo.MyTable'

모든 테이블에 대해 .. (Paul의 의견에서 추가)을 사용하십시오.

exec sp_MSForEachTable 'exec sp_spaceused [?]'


답변

위의 쿼리는 테이블에 사용 된 공간의 양 (인덱스 포함)을 찾는 데 유용하지만 테이블의 인덱스에 사용 된 공간의 양을 비교하려면이 쿼리를 사용하십시오.

SELECT
    OBJECT_NAME(i.OBJECT_ID) AS TableName,
    i.name AS IndexName,
    i.index_id AS IndexID,
    8 * SUM(a.used_pages) AS 'Indexsize(KB)'
FROM
    sys.indexes AS i
    JOIN sys.partitions AS p ON p.OBJECT_ID = i.OBJECT_ID AND p.index_id = i.index_id
    JOIN sys.allocation_units AS a ON a.container_id = p.partition_id
WHERE
    i.is_primary_key = 0 -- fix for size discrepancy
GROUP BY
    i.OBJECT_ID,
    i.index_id,
    i.name
ORDER BY
    OBJECT_NAME(i.OBJECT_ID),
    i.index_id