使用以下查询我可以获得表索引的大小:
SELECT
i.name AS IndexName,
SUM(page_count * 8) AS IndexSizeKB
FROM sys.dm_db_index_physical_stats(db_id(), object_id('schema.table'), NULL, NULL, 'DETAILED') AS s
JOIN sys.indexes AS i
ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id
GROUP BY i.name
ORDER BY i.name
Run Code Online (Sandbox Code Playgroud)
如果我执行sp_spaceused 'schema.table'
没有索引的大小是否对应于data
列?
有什么方法可以获取sql server中没有索引的表的大小吗?(SELECT
声明会很好,因为我想将此查询插入到更大的查询中)。
如果我执行获取数据库中所有表的大小,表的大小几乎与索引的大小相同(表明有问题)。
有多种方法可以查找数据库中表的大小。第一种也是最简单的方法是右键单击表并检查存储选项卡,这将为您提供数据空间和索引空间。数据空间只不过是表中数据的大小,类似地索引空间给出了上述表中索引的大小。
上面的信息与命令完全匹配sp_spaceused 'schema_name.table_name'
我们可以交叉检查用户表(在 dbo 模式和 StackOverFlow 数据库中)。
在这里,如果您添加数据、索引大小和未使用的(以KB为单位),您将获得表的保留空间。
您还可以通过运行命令sp_blitzindex(来自Brent Ozar先生)来检查表和索引的大小。命令如下:
exec sp_BlitzIndex @SchemaName = 'dbo', @TableName = 'Users'
Run Code Online (Sandbox Code Playgroud)
在这里,您可以检查“大小”栏。聚集索引大小将为您提供表大小,您还可以找到每个索引的大小及其用法(如果感兴趣)。
此外,您还可以通过进入报告来检查所有表的大小,如下所示:
您还可以运行下面的 select语句来获取所有表的完整大小和索引大小:
;with cte as (
SELECT
t.name as TableName,
SUM (s.used_page_count) as used_pages_count,
SUM (CASE
WHEN (i.index_id < 2) THEN (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count)
ELSE lob_used_page_count + row_overflow_used_page_count
END) as pages
FROM sys.dm_db_partition_stats AS s
JOIN sys.tables AS t ON s.object_id = t.object_id
JOIN sys.indexes AS i ON i.[object_id] = t.[object_id] AND s.index_id = i.index_id
GROUP BY t.name
)
select
cte.TableName,
cast((cte.pages * 8.)/1024 as decimal(10,3)) as TableSizeInMB,
cast(((CASE WHEN cte.used_pages_count > cte.pages
THEN cte.used_pages_count - cte.pages
ELSE 0
END) * 8./1024) as decimal(10,3)) as IndexSizeInMB
from cte
order by 2 desc
Run Code Online (Sandbox Code Playgroud)
如果您只需要表大小,请执行以下命令:
SELECT
t.name as TableName
, SUM (CASE WHEN (i.index_id < 2)
THEN (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count)
ELSE lob_used_page_count + row_overflow_used_page_count
END) * 8 as table_size_kb
FROM sys.dm_db_partition_stats AS s
JOIN sys.tables AS t ON s.object_id = t.object_id
JOIN sys.indexes AS i ON i.[object_id] = t.[object_id] AND s.index_id = i.index_id
where t.object_id = OBJECT_ID('schema.table')
GROUP BY t.name
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。
归档时间: |
|
查看次数: |
2767 次 |
最近记录: |