Я работаю над очень большой таблицей (примерно 2,7 миллиона строк добавляется в день), которая имеет следующую структуру:
CREATE TABLE [dbo].[Result](
[ResultDate] [date] NOT NULL,
[Thing1Id] [int] NOT NULL,
[Num] [int] NOT NULL,
[Thing2Id] [int] NOT NULL,
CONSTRAINT [PK_Result] PRIMARY KEY CLUSTERED
(
[ResultDate] ASC,
[Thing1Id] ASC,
[Num] ASC
))
Поскольку кластеризованный первичный ключ находится в ResultDate, Thing1Id и Num, я ожидаю, что следующий запрос будет оптимальным:
SELECT Thing2.*
FROM dbo.Result
INNER JOIN Thing2 ON Thing2.Id = result.Thing2Id
WHERE
ResultDate >= '2012-01-01'
AND
ResultDate <= '2012-01-30'
AND Thing1Id = 23
Как видите, запрос находит результаты за 12 января для конкретной вещи 1.
Однако план выполнения показывает, что можно добиться значительного увеличения производительности, добавив следующий индекс:
CREATE NONCLUSTERED INDEX [IX_Missing]
ON [dbo].[Result] ([Thing1Id],[ResultDate])
INCLUDE ([Num],[Thing2Id])
И, конечно же, добавление этого индекса значительно повышает производительность.
Может кто-нибудь объяснить, почему? Насколько я понимаю, результаты должны быть достаточно сужены с использованием кластеризованного первичного ключа, и добавление этого сделает размер индекса намного больше и добавит ненужные накладные расходы.
Могу ли я индексировать таблицу по-другому, чтобы повысить производительность?
(Обратите внимание, что на самом деле таблица представляет собой две объединенные таблицы, данные передаются из одной в другую ежедневно, а данные секционируются ежемесячно).
dbo.Result(Thing2Id)
немного ускорит ваш запрос, основываясь на том факте, чтоThing2Id
является внешним ключом и используется в вашем выраженииINNER JOIN Thing2 ON Thing2.Id = result.Thing2Id
... - person marc_s   schedule 05.12.2012