Şu anda tamamlamak için ortalama 2500 ms süren bir sorgu var. Masam çok dar, ama 44 milyon sıra var. Performansı artırmak için hangi seçeneklere ihtiyacım var veya bu mümkün olduğunca iyi mi?
Sorgu
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31';
Tablo
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]
İçerik
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]
Ek dizinler eklemek yardımcı olur mu? Eğer öyleyse, neye benziyorlardı? Mevcut performans kabul edilebilir, çünkü sorgu sadece ara sıra çalışıyor, ama bir öğrenme alıştırması olarak merak ediyorum, bunu daha hızlı yapmak için yapabileceğim bir şey var mı?
GÜNCELLEME
Bir kuvvet dizini ipucu kullanmak için sorguyu değiştirdiğimde, sorgu 50ms yürütür:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WITH(INDEX(CommonQueryIndex))
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'
Doğru seçili bir DeviceID yantümcesi eklemek de 50ms aralığına vurur:
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]
Orijinal sorguyu eklerseniz , ben 50ms aralığındayım:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'
ORDER BY [DateEntered], [DeviceID];
Bunların hepsi beklediğim dizini (CommonQueryIndex) kullanıyor, bu yüzden sorum şu an, bu dizini böyle sorgularda kullanılmaya zorlamanın bir yolu var mı? Yoksa masamın boyutu optimize ediciyi çok fazla atıyor mu ve sadece bir ORDER BY
veya ipucu kullanmalıyım?