SQL 服务器聚集索引大于实际 table。为什么以及如何修复它?

SQL Server clustered index bigger than actual table. Why and how do I fix it?

我在 SQL 服务器数据库中有几个 table,其中聚集索引非常大,高达 table 大小的 50%,仅用于 ID?

例如:

获取我正在使用的索引大小的脚本是:https://blog.sqlauthority.com/2016/11/13/find-size-indexes-database-interview-question-week-097/

SELECT
    OBJECT_SCHEMA_NAME(i.OBJECT_ID) AS SchemaName,
    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_i = 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 
    8 * SUM(a.used_pages)

索引代码如下(table都一样):

ALTER TABLE [dbo].[my_Table] 
     ADD PRIMARY KEY CLUSTERED ([pkID] ASC)
         WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
               SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, 
               ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

有人可以帮我解决这个问题或帮助解释为什么会这样吗?

索引完全没有碎片化(<5%),肯定是聚簇索引,只是有PK在里面?每个 table 中都有一个 nvarchar(max),索引中会包含一个 "hidden" 吗?仍然没有解释为什么它比实际的 table 大?

我正在使用 SQL Server 2016 Standard。

谢谢你,祝你有美好的一天。 韦德

我们通常使用超过 1 GB 的初始日志文件来避免更多的 VLF,这有助于更快地恢复并提高性能。并且自动增长应该超过 1 GB,这将严格生成更多 VLF。

如果您知道自己的加载行为,那么您可以分配最大初始大小,这将有助于提高性能,因为它不会每次都去初始化文件。

如果有帮助,请告诉我。