У меня есть запрос, который в настоящее время занимает в среднем 2500 мсек. Моя таблица очень узкая, но в ней 44 миллиона строк. Какие варианты у меня есть, чтобы улучшить производительность, или это так хорошо, как это получается?
Запрос
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31';
Таблица
CREATE TABLE [dbo].[Heartbeats](
[ID] [int] IDENTITY(1,1) NOT NULL,
[DeviceID] [int] NOT NULL,
[IsPUp] [bit] NOT NULL,
[IsWebUp] [bit] NOT NULL,
[IsPingUp] [bit] NOT NULL,
[DateEntered] [datetime] NOT NULL,
CONSTRAINT [PK_Heartbeats] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Индекс
CREATE NONCLUSTERED INDEX [CommonQueryIndex] ON [dbo].[Heartbeats]
(
[DateEntered] ASC,
[DeviceID] 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]
Поможет ли добавление дополнительных индексов? Если так, то как бы они выглядели? Текущая производительность является приемлемой, поскольку запрос выполняется только изредка, но мне интересно как учебное упражнение, могу ли я что-нибудь сделать, чтобы сделать это быстрее?
ОБНОВИТЬ
Когда я изменяю запрос на использование подсказки принудительного индекса, запрос выполняется за 50 мс:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WITH(INDEX(CommonQueryIndex))
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'
Добавление правильно выбранного предложения DeviceID также попадает в диапазон 50 мс:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31' AND DeviceID = 4;
Если я добавлю ORDER BY [DateEntered], [DeviceID]
к исходному запросу, я нахожусь в диапазоне 50 мс:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'
ORDER BY [DateEntered], [DeviceID];
Все они используют индекс, который я ожидал (CommonQueryIndex), так что, я полагаю, мой вопрос сейчас, есть ли способ заставить этот индекс использоваться в таких запросах, как этот? Или это размер моего стола сбросив оптимизатор слишком много , и я просто должен использовать ORDER BY
или намек?