Индекс не используется в новых строках - PullRequest
1 голос
/ 22 июня 2011

SQL Server 2008. У нас есть таблица базы данных объемом 1 ТБ (с полем большого двоичного объекта с данными изображений), для которой существует индекс date и account number.

Мы вставляем около 30 тысяч строк в день.Индекс будет правильно использоваться в плане запроса при поиске по датам, которые СУЩЕСТВУЮТ ДО создания (или перестроения) индекса.Однако при поиске новых строк (строк, добавленных с момента создания индекса) он использует только кластерный индекс PK.

Я новичок в этом, но мне не нужно ежедневно перестраивать индекс?Статистика не обновляется в последние несколько дней (так как я перестраиваю индекс), но она настроена на автоматическое обновление.

CREATE NONCLUSTERED INDEX [IDX_ProcessDate_Account] ON [dbo].[tablename] 
(
    [Date] DESC,
    [Account] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

1 Ответ

1 голос
/ 23 июня 2011

Нет, вам не нужно ежедневно перестраивать.

SQL может инициировать обновление статистики, но тем временем продолжать использовать старую статистику, потому что обновление занимает некоторое время. Особенно на VLDB. Таким образом, автоматическое обновление, вероятно, выполняет свою работу, но из-за нехватки ресурсов или времени, которое требуется для получения более качественной информации, оптимизатор пока не может воспользоваться этим.

Запустите это, чтобы увидеть, когда в последний раз было запущено автообновление

DBCC show_statistics ('<yer table>', '<yer index>') WITH STAT_HEADER

Если ваша таблица получает обновления только в пакетном режиме. (Вы упоминаете 30 тыс. строк в день; это все одновременно ??). Microsoft рекомендует вместо использования автообновления в сценарии, где вы вставляете большое количество строк в один пакет , а затем мало или нет строк после , чтобы вместо этого запускать Обновлять статистику с полным сканированием . (примечание: это все еще занимает некоторое время)

...