如何估计 SQL Server 索引大小

Posted

技术标签:

【中文标题】如何估计 SQL Server 索引大小【英文标题】:How do I estimate SQL Server index sizes 【发布时间】:2010-09-15 16:58:33 【问题描述】:

虽然估计直线行和表大小是相当简单的数学运算,但我们发现猜测每个索引将占用多少空间(对于给定的表大小)具有挑战性。我们可以学习哪些领域来计算更好的指数估计值和增长率?

【问题讨论】:

【参考方案1】:

如果可能,我一般会从原始表中取出 1000 条记录, 将它们插入我自己的表中, 并且使用下面的脚本,我可以使用一个示例。

好吧,这不准确,但可以给我一个起点。

--Find out the disk size of an index:
--USE [DB NAME HERE]
go
SELECT
OBJECT_NAME(I.OBJECT_ID) AS TableName,
I.name AS IndexName,   
8 * SUM(AU.used_pages) AS 'Index size (KB)',
CAST(8 * SUM(AU.used_pages) / 1024.0 AS DECIMAL(18,2)) AS 'Index size (MB)'
FROM
sys.indexes I
JOIN sys.partitions P ON P.OBJECT_ID = I.OBJECT_ID AND P.index_id = I.index_id
JOIN sys.allocation_units AU ON AU.container_id = P.partition_id
--WHERE 
--    OBJECT_NAME(I.OBJECT_ID) = '<TableName>'    
GROUP BY
I.OBJECT_ID,    
I.name
ORDER BY
TableName

--========================================================================================

--http://msdn.microsoft.com/en-us/library/fooec9de780-68fd-4551-b70b-2d3ab3709b3e.aspx

--I believe that keeping the GROUP BY 
--is the best option in this case
--because of sys.allocation_units
--can have 4 types of data inside
--as below:

--type tinyint
--Type of allocation unit.
--0 = Dropped
--1 = In-row data (all data types, except LOB data types)
--2 = Large object (LOB) data (text, ntext, image, xml, large value types, and CLR     user-defined types)
--3 = Row-overflow data

--marcelo miorelli 8-NOV-2013
--========================================================================================

【讨论】:

【参考方案2】:

索引叶子有一个前导码,用于标识数据页(7 个字节加上一些可变长度列的目录信息,如果有的话)加上一个键值的副本,该副本的大小与那些的表数据相同列。表格中的每一行都有一个。索引的较高级别要小得多,通常不到叶子的 1%,除非您正在索引一个非常宽的键。

填充因子留出一些空间,以便更新和插入不会产生过多的叶子分裂流量。

编辑:This MSDN link 描述了页面级结构,尽管它对单个索引行的格式有点轻描淡写。 This presentation 在某种程度上进入了磁盘日志条目和数据页的物理格式。 This one 更详细,包括索引数据结构。数字列和固定长度列的大小与盒子上说的一样;您将不得不估计 varchar 列的平均大小。

Oracle 块格式的一些文档可以参考Here 和Here。

【讨论】:

您能否参考一些文档以获取此信息?谢谢 忘记 16 个字节。我在想甲骨文。第三个 SQL Server 参考对此进行了详细介绍。

以上是关于如何估计 SQL Server 索引大小的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何工具可以估计 MongoDB 中的索引大小?

SQL Server 如何处理非聚集索引中的包含列?

SQL server 2014 安装

SQL Server:如何增加事务日志的大小?

使用 TinyInt 还是 Bit 对 SQL Server 有影响吗?大小和查询性能

如何管理 SQL Server 日志大小