Кластерный индекс SQL Server больше, чем фактическая таблица. Почему и как мне это исправить? - PullRequest
0 голосов
/ 04 января 2019

У меня есть несколько таблиц в базе данных 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

1 Ответ

0 голосов
/ 22 марта 2019

Мы обычно используем для файла журнала начальные значения более одного ГБ, чтобы избежать увеличения VLF, что помогает ускорить восстановление и повысить производительность. а также автоматический рост должен быть больше 1 ГБ, что будет строго генерировать больше VLF.

Если вы знаете свое поведение при загрузке, вы можете выбрать максимальный начальный размер, который поможет улучшить производительность, поскольку он не будет выполнять инициализацию файла каждый раз.

Пожалуйста, дайте мне знать, если это будет полезно.

...