我在SQL Server数据库中有几个表,其中聚集索引非常大,高达表大小的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)
索引代码如下(两个表都相同):
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。
谢谢你,祝你有个美好的一天。涉
我们通常使用初始文件超过一GB来避免更多的VLF,这有助于更快地恢复并提高性能。并且自动增长应该超过1 GB,这将严格产生更多的VLF。
如果你知道你的加载行为,那么你可以去分配最大的初始大小,这将有助于提高性能,因为它不会每次都进行初始化。
如果它有用,请告诉我。