У мене є запит, який зараз займає в середньому 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
або підказку?