상당히 큰 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)을 대신 (쿼리 실행하는 내 경우에는 중복 행을 반환 ) 당신은 실행할 수있는 표준 보고서를 .
- 데이터베이스를 마우스 오른쪽 버튼으로 클릭하십시오
- 보고서> 표준 보고서> 테이블 별 디스크 사용량으로 이동하십시오.
참고 :이 기능이 제대로 작동하려면 데이터베이스 호환성 수준을 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