У меня есть несколько таблиц в базе данных SQL Server, где кластерный индекс действительно большой, до 50% от размера таблицы, только для идентификаторов?
Например:
- Таблица 1 30 миллионов строк, 10 ГБ данных, кластерный индекс = 10 ГБ
- Таблица 2 40 миллионов строк, 2,4 ГБ данных, кластерный индекс = 18 ГБ
Скрипт для получения размера используемых мной индексов: 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? В каждой таблице есть <code>nvarchar(max), будет ли это «скрытым» включением в индекс? Тем не менее, не объясняет, почему он больше, чем фактическая таблица?
Я использую SQL Server 2016 Standard.
Спасибо, хорошего вам дня.
Wade