2008-10-07 86 views
3

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

回答

6

索引页面有一个标识数据页的引言(7字节加上可变长度列的某些目录信息,如果有的话)加上与表格数据大小相同的键值副本那些专栏。表中的每一行都有一个。指数较高的水平要小得多,通常小于叶子的1%,除非你要索引一个非常宽的关键。

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

编辑:This MSDN link描述了页面级别的结构,虽然它对单个索引行的格式稍微有点亮。 This presentation在某种程度上进入了磁盘日志条目和数据页面的物理格式。 This one更多细节,并包括索引数据结构。数字和固定长度的列具有它在盒子上表示的大小;你将不得不估计varchar列的平均大小。

作为参考,Oracle的块格式的一些文件可以找到HereHere

+0

请问您可以参考一些文档的这些信息?谢谢 – icelava 2008-10-07 09:06:48

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 
--========================================================================================