代码之家  ›  专栏  ›  技术社区  ›  icelava

如何估计SQL Server索引大小

  •  4
  • icelava  · 技术社区  · 16 年前

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

    2 回复  |  直到 10 年前
        1
  •  6
  •   ConcernedOfTunbridgeWells    16 年前

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

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

    编辑: This MSDN link 描述页级结构,尽管它对单个索引行的格式有点轻描淡写。 This presentation 在某种程度上进入磁盘日志条目和数据页的物理格式。 This one 更详细,包括索引数据结构。数值列和固定长度列的大小与框中的大小相同;您必须估计varchar列的平均大小。

    为了参考,可以找到一些Oracle块格式的文档 Here Here .

        2
  •  1
  •   Marcello Miorelli    10 年前

    如果可能的话,我通常从原始表中取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
    --========================================================================================