Tôi có một truy vấn hiện đang mất trung bình 2500ms để hoàn thành. Bàn của tôi rất hẹp, nhưng có 44 triệu hàng. Tôi có những lựa chọn nào để cải thiện hiệu suất, hay nó có tốt như vậy không?
Truy vấn
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31';
Cái bàn
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]
Chỉ số
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]
Sẽ thêm chỉ số bổ sung giúp? Nếu vậy, họ sẽ trông như thế nào? Hiệu suất hiện tại có thể chấp nhận được, bởi vì truy vấn chỉ thỉnh thoảng chạy, nhưng tôi tự hỏi là một bài tập học tập, tôi có thể làm gì để làm điều này nhanh hơn không?
CẬP NHẬT
Khi tôi thay đổi truy vấn để sử dụng gợi ý chỉ số lực lượng, truy vấn sẽ thực hiện trong 50ms:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WITH(INDEX(CommonQueryIndex))
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'
Thêm một mệnh đề DeviceID chọn lọc chính xác cũng đạt phạm vi 50ms:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31' AND DeviceID = 4;
Nếu tôi thêm ORDER BY [DateEntered], [DeviceID]
vào truy vấn ban đầu, tôi ở trong phạm vi 50ms:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'
ORDER BY [DateEntered], [DeviceID];
Tất cả đều sử dụng chỉ mục mà tôi mong đợi (CommonQuery Index) vì vậy, tôi cho rằng câu hỏi của tôi là bây giờ, có cách nào để buộc chỉ mục này được sử dụng cho các truy vấn như thế này không? Hoặc là kích thước của bảng của tôi ném ra trình tối ưu hóa quá nhiều và tôi chỉ cần sử dụng một ORDER BY
hoặc một gợi ý?