sql server中没有索引的表大小

art*_*hur 3 sql-server size

使用以下查询我可以获得表索引的大小:

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声明会很好,因为我想将此查询插入到更大的查询中)。

如果我执行获取数据库中所有表的大小,表的大小几乎与索引的大小相同(表明有问题)。

Lea*_*min 6

有多种方法可以查找数据库中表的大小。第一种也是最简单的方法是右键单击表并检查存储选项卡,这将为您提供数据空间和索引空间。数据空间只不过是表中数据的大小,类似地索引空间给出了上述表中索引的大小。

表存储

上面的信息与命令完全匹配sp_spaceused 'schema_name.table_name'我们可以交叉检查用户表(在 dbo 模式和 StackOverFlow 数据库中)。

sp_spaceused

在这里,如果您添加数据、索引大小和未使用的(以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)

希望这可以帮助。