SQL Server
[MSSQL] 6. 모든 인덱스 용량 조회
푸팟퐁쿼리
2023. 4. 14. 11:58
1. 특정 DB의 인덱스 용량만 조회할 경우
SELECT
OBJECT_SCHEMA_NAME(i.object_id) AS SchemaName,
OBJECT_NAME(i.OBJECT_ID) AS TableName,
i.name AS IndexName,
i.index_id AS IndexID,
CASE i.index_id WHEN 1 THEN 'Clustered Index' ELSE 'NonClustered Index' END AS IndexType,
SUM(au.used_pages) * 8 AS 'Indexsize(KB)'
FROM
sys.indexes AS i
INNER JOIN sys.partitions AS p
ON p.OBJECT_ID = i.OBJECT_ID
AND p.index_id = i.index_id
INNER JOIN sys.allocation_units AS au
ON au.container_id = p.partition_id
WHERE
i.index_id != 0 -- not heap
and OBJECT_SCHEMA_NAME(i.object_id) != 'sys' -- not system table
GROUP BY
OBJECT_SCHEMA_NAME(i.object_id),
OBJECT_NAME(i.OBJECT_ID),
i.OBJECT_ID,
i.index_id,
i.name
ORDER BY
SUM(au.used_pages) * 8 desc,
OBJECT_SCHEMA_NAME(i.object_id),
OBJECT_NAME(i.OBJECT_ID),
i.index_id
GO
2. 장비 내 전체 DB의 인덱스 용량을 전부 조회할 경우
DROP TABLE IF EXISTS #temp2
GO
SELECT TOP 0
DB_ID() AS DBID,
DB_NAME() AS DBName,
OBJECT_SCHEMA_NAME(i.object_id) AS SchemaName,
OBJECT_NAME(i.OBJECT_ID) AS TableName,
i.name AS IndexName,
i.index_id AS IndexID,
CASE i.index_id WHEN 1 THEN 'Clustered Index' ELSE 'NonClustered Index' END AS IndexType,
SUM(au.used_pages) * 8 AS 'Indexsize(KB)'
INTO #temp2
FROM
sys.indexes AS i
INNER JOIN sys.partitions AS p
ON p.OBJECT_ID = i.OBJECT_ID
AND p.index_id = i.index_id
INNER JOIN sys.allocation_units AS au
ON au.container_id = p.partition_id
WHERE
i.index_id != 0 -- not heap
and OBJECT_SCHEMA_NAME(i.object_id) != 'sys' -- not system table
GROUP BY
OBJECT_SCHEMA_NAME(i.object_id),
OBJECT_NAME(i.OBJECT_ID),
i.OBJECT_ID,
i.index_id,
i.name
ORDER BY
SUM(au.used_pages) * 8 desc,
OBJECT_SCHEMA_NAME(i.object_id),
OBJECT_NAME(i.OBJECT_ID),
i.index_id
GO
DECLARE @command varchar(MAX)
SELECT @command =
'USE [?] INSERT INTO #temp2
SELECT
DB_ID() AS DBID,
DB_NAME() AS DBName,
OBJECT_SCHEMA_NAME(i.object_id) AS SchemaName,
OBJECT_NAME(i.OBJECT_ID) AS TableName,
i.name AS IndexName,
i.index_id AS IndexID,
CASE i.index_id WHEN 1 THEN ''Clustered Index'' ELSE ''NonClustered Index'' END AS IndexType,
SUM(au.used_pages) * 8 AS ''Indexsize(KB)''
FROM
sys.indexes AS i
INNER JOIN sys.partitions AS p
ON p.OBJECT_ID = i.OBJECT_ID
AND p.index_id = i.index_id
INNER JOIN sys.allocation_units AS au
ON au.container_id = p.partition_id
WHERE
i.index_id != 0 -- not heap
and OBJECT_SCHEMA_NAME(i.object_id) != ''sys'' -- not system table
GROUP BY
OBJECT_SCHEMA_NAME(i.object_id),
OBJECT_NAME(i.OBJECT_ID),
i.OBJECT_ID,
i.index_id,
i.name
ORDER BY
SUM(au.used_pages) * 8 desc,
OBJECT_SCHEMA_NAME(i.object_id),
OBJECT_NAME(i.OBJECT_ID),
i.index_id'
EXEC sp_MSforeachdb @command
GO
SELECT *
FROM #temp2
ORDER BY [Indexsize(KB)] DESC
GO