2

我正在尝试使用MSDN 网站上提供的信息来估计索引大小。

让我们考虑一个包含三列的表“Table1”。下面列出了这些列,

  1. Id int,不为空
  2. 标记 int,不为 null
  3. SubmitDate 日期,不为空

最初,我在 Id 列上创建了一个聚集主键,然后计划创建一个以“Id”作为“索引键列”的非聚集索引,其中“Marks”“SubmitDate”列将用作“包含列” “在索引中。

基于上述计划,我试图在创建非聚集索引键大小之前对其进行估计。在浏览MSDN 站点时,我有很多困惑需要澄清。估计非聚集索引键大小有四个步骤,第一步,1.2 和 1.3解释了如何计算 Num_Key_Cols、Fixed_Key_Size、Num_Variable_Key_Cols 和 Max_Var_Key_Size。但是在 1.2 和 1.3 中,我们应该根据索引键类型来计算,我们是否已经有聚集索引键,我们是否包含列;这似乎令人困惑。任何人都可以根据我提供的有关示例表(Table1)和我想创建的非聚集索引键结构的信息来帮助我。

就我而言,我已经包含了列,索引键列已经是主键,并且所有列都不是空字段。如何计算它的索引大小?

提前致谢。

4

2 回答 2

3

最初,我在 Id 列上创建了一个聚集主键,然后计划创建一个以“Id”作为“索引键列”的非聚集索引,其中“Marks”和“SubmitDate”列将用作“包含列” “在索引中。

我不会这样做的。通过使Id主键(即唯一)和表的集群键(只有 3 列),添加进一步的 NC 索引没有什么意义Id- 集群索引就足够了。

如果表中有大量(页上)列,则可能有理由在Id包含列的情况下添加另一个 NC 索引,(Marks, SubmitDate)因为 NC 索引密度会更高。但这显然不是这里的情况。

MSDN NC 尺寸链接的一些说明:

  • 在树的所有级别中都需要考虑直接索引列。
  • INCLUDE列仅存在于树的叶节点中
  • Num_Key_Cols = Num_Key_Cols + 1仅当 Sql Server 添加一个4 字节的唯一标识符(如果 Clustering 键不是唯一的)时才需要。您已经按主键进行了聚类,因此它是唯一的,所以不是 +1。

记住也要对真实数据进行经验测量

并非所有表和索引都有固定的列宽 - 许多表和索引都有可变长度的索引列,例如(N)VARCHAR,在这种情况下,表和索引消耗的实际存储空间高度依赖于这些字段的平均长度。

在这种情况下,我建议创建表并用近似数据填充它,然后使用 和 之类的工具测量实际数据存储sp_spaceusedsys.dm_db_index_physical_stats例如:

select * from sys.dm_db_index_physical_stats (DB_ID(), 
           OBJECT_ID(N'dbo.Table1'), NULL, NULL , 'DETAILED');

(页面大小为 8192)

编辑

只是为了说明,如果你已经有了这个:

CREATE TABLE Table1
(
    Id INT IDENTITY(1,1),
    Marks INT NOT NULL,
    SubmitDate DATE NOT NULL
);

ALTER TABLE Table1 ADD CONSTRAINT PK_Table1 PRIMARY KEY CLUSTERED (Id);

那么这样做也没有意义:

CREATE NONCLUSTERED INDEX IX_Table1 on Table1(Id) INCLUDE (Marks, SubmitDate)

由于聚集索引已经ID像 NC 索引一样高效地搜索/扫描 - 您只需将存储需求增加一倍。

顺便说一句,还请注意,通常聚集索引键自动包含在所有非聚集索引中,并且不需要显式添加到非聚集索引中。

于 2015-03-28T13:51:18.370 回答
0
SELECT
OBJECT_NAME(i.OBJECT_ID) AS TableName,
i.name AS IndexName,
i.index_id AS IndexID,
8 * SUM(a.used_pages) AS 'Indexsize(KB)'
FROM sys.indexes AS i
JOIN sys.partitions AS p ON p.OBJECT_ID = i.OBJECT_ID AND p.index_id = i.index_id
JOIN sys.allocation_units AS a ON a.container_id = p.partition_id
GROUP BY i.OBJECT_ID,i.index_id,i.name
ORDER BY OBJECT_NAME(i.OBJECT_ID),i.index_id
于 2015-03-28T13:42:44.660 回答