SQL Server聚集索引比实际表大。为什么以及如何解决?

问题描述 投票:2回答:1

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

例如 :

  • 表1 30万行,10GB数据,聚簇索引= 10GB
  • 表2 40万行,2.4GB数据,聚簇索引= 18GB

获取我正在使用的索引大小的脚本是: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)

索引代码如下(两个表都相同):

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吗?每个表中都有一个nvarchar(max),它是否会在索引中包含“隐藏”?仍然没有解释为什么它比实际的表大?

我使用的是SQL Server 2016 Standard。

谢谢你,祝你有个美好的一天。涉

sql-server database sql-server-2016 database-administration clustered-index
1个回答
0
投票

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

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

如果它有用,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.