Saya memiliki permintaan yang saat ini sedang menyelesaikan rata-rata 2500 ms. Meja saya sangat sempit, tetapi ada 44 juta baris. Opsi apa yang saya miliki untuk meningkatkan kinerja, atau apakah ini sebagus yang didapat?
The Query
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31';
Meja
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]
Indeks
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]
Apakah menambahkan indeks tambahan akan membantu? Jika demikian, akan seperti apa mereka? Kinerja saat ini dapat diterima, karena kueri hanya berjalan sesekali, tetapi saya bertanya-tanya sebagai latihan pembelajaran, adakah yang bisa saya lakukan untuk membuatnya lebih cepat?
MEMPERBARUI
Ketika saya mengubah kueri untuk menggunakan petunjuk indeks gaya, kueri dijalankan dalam 50ms:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WITH(INDEX(CommonQueryIndex))
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'
Menambahkan klausa DeviceID selektif dengan benar juga mencapai kisaran 50ms:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31' AND DeviceID = 4;
Jika saya menambahkan ORDER BY [DateEntered], [DeviceID]
ke permintaan asli, saya berada di kisaran 50ms:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'
ORDER BY [DateEntered], [DeviceID];
Ini semua menggunakan indeks yang saya harapkan (CommonQueryIndex) jadi, saya kira pertanyaan saya sekarang, apakah ada cara untuk memaksa indeks ini digunakan pada pertanyaan seperti ini? Atau apakah ukuran meja saya terlalu banyak membuang pengoptimal dan saya harus menggunakan ORDER BY
atau memberi petunjuk?