У нас возникла проблема, когда индексы на наших таблицах игнорируются, а SQL Server 2000 выполняет сканирование таблицы. Мы можем принудительно использовать индексы с помощью предложения WITH (INDEX=<index_name>)
, но предпочли бы не делать этого.
Как разработчик, я очень хорошо знаком с SQL Server при написании T-SQL, но профилирование и настройка производительности - не моя сильная сторона. Я ищу любые советы и рекомендации относительно того, почему это может происходить.
Update:
Я должен был сказать, что мы перестроили все индексы и обновили статистику индексов.
Определение таблицы для одного из виновников выглядит следующим образом:
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
Обновлено:
В ответ на вопрос автократии оба этих запроса выполняют сканирование таблицы.
Обновлено:
В ответ на вопрос Quassnoi о 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