Почему мои индексы SQL игнорируются? - PullRequest
11 голосов
/ 09 июня 2009

У нас проблема с тем, что индексы в наших таблицах игнорируются, а вместо этого SQL Server 2000 выполняет сканирование таблиц. Мы можем форсировать использование индексов с помощью предложения WITH (INDEX=<index_name>), но предпочли бы не делать этого.

Как разработчик, я хорошо знаком с SQL Server при написании T-SQL, но профилирование и настройка производительности - не моя сильная сторона. Я ищу любые советы и указания относительно того, почему это может происходить.

Обновление:

Я должен был сказать, что мы перестроили все индексы и обновили статистику индексов.

Определение таблицы для одного из виновников выглядит следующим образом:

CREATE TABLE [tblinvoices]
(
    [CustomerID] [int] NOT NULL,
    [InvoiceNo] [int] NOT NULL,
    [InvoiceDate] [smalldatetime] NOT NULL,
    [InvoiceTotal] [numeric](18, 2) NOT NULL,
    [AmountPaid] [numeric](18, 2) NULL 
        CONSTRAINT [DF_tblinvoices_AmountPaid]  DEFAULT (0),
    [DateEntered] [smalldatetime] NULL 
        CONSTRAINT [DF_tblinvoices_DateEntered]  DEFAULT (getdate()),
    [PaymentRef] [varchar](110),
    [PaymentType] [varchar](10),
    [SyncStatus] [int] NULL,
    [PeriodStart] [smalldatetime] NULL,
    [DateIssued] [smalldatetime] NULL 
        CONSTRAINT [DF_tblinvoices_dateissued]  DEFAULT (getdate()),
    CONSTRAINT [PK_tblinvoices] PRIMARY KEY NONCLUSTERED 
    (
        [InvoiceNo] ASC
    ) ON [PRIMARY]
) ON [PRIMARY]

В этой таблице есть еще один индекс (тот, который мы хотим использовать в SQL):

CustomerID (Non-Unique, Non-Clustered)

Следующий запрос выполняет сканирование таблицы вместо использования индекса CustomerID:

SELECT 
    CustomerID, 
    Sum(InvoiceTotal) AS SumOfInvoiceTotal, 
    Sum(AmountPaid) AS SumOfAmountPaid 
FROM tblInvoices 
WHERE CustomerID = 2112 
GROUP BY customerID

Обновлен:

В ответ на вопрос самодержавия оба эти запроса выполняют сканирование таблицы.

Обновлен:

В ответ на вопрос Кассного о DBCC SHOW_STATISTICS, данные:

RANGE_HI_KEY    RANGE_ROWS    EQ_ROWS    DISTINCT_RANGE_ROWS    AVG_RANGE_ROWS
1667            246           454        8                      27.33333
2112            911           3427       16                     56.9375
2133            914           775        16                     57.125

Ответы [ 12 ]

0 голосов
/ 09 июня 2009

Попробуйте обновить статистику . Эти статистические данные являются основой для решений, принятых компилятором о том, должен ли он использовать индекс или нет. Они содержат такую ​​информацию, как количество элементов и количество строк для каждой таблицы.

Например, если статистика не обновлялась с тех пор, как вы сделали большой массовый импорт, компилятор может все еще думать, что в таблице всего 10 строк, и не беспокоиться об индексе.

0 голосов
/ 09 июня 2009

Вы также можете попробовать выполнить UPDATE STATISTICS для таблицы (или таблиц), участвующих в запросе. Не то чтобы я полностью понимал статистику в SQL, но я знаю, что это то, что иногда делают наши администраторы баз данных (с еженедельной запланированной работой по обновлению статистики для больших и часто изменяемых таблиц).

Статистика SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...