SQL 服务器聚集索引大于实际 table。为什么以及如何修复它?
SQL Server clustered index bigger than actual table. Why and how do I fix it?
我在 SQL 服务器数据库中有几个 table,其中聚集索引非常大,高达 table 大小的 50%,仅用于 ID?
例如:
- Table1 3000万行,10GB数据,聚簇索引=10GB
- Table2 4000万行,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)
索引代码如下(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。
如果您知道自己的加载行为,那么您可以分配最大初始大小,这将有助于提高性能,因为它不会每次都去初始化文件。
如果有帮助,请告诉我。
我在 SQL 服务器数据库中有几个 table,其中聚集索引非常大,高达 table 大小的 50%,仅用于 ID?
例如:
- Table1 3000万行,10GB数据,聚簇索引=10GB
- Table2 4000万行,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)
索引代码如下(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。
如果您知道自己的加载行为,那么您可以分配最大初始大小,这将有助于提高性能,因为它不会每次都去初始化文件。
如果有帮助,请告诉我。