मेरे पास एक क्वेरी है जो वर्तमान में पूरा करने के लिए औसतन 2500ms ले रही है। मेरी तालिका बहुत संकीर्ण है, लेकिन 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]
क्या अतिरिक्त इंडेक्स जोड़ने से मदद मिलेगी? यदि हां, तो वे कैसा दिखेंगे? वर्तमान प्रदर्शन स्वीकार्य है, क्योंकि क्वेरी केवल कभी-कभी ही चलती है, लेकिन मैं एक सीखने की कवायद के रूप में सोच रहा हूं, क्या ऐसा कुछ है जो मैं उसे तेज कर सकता हूं?
अपडेट करें
जब मैं बल इंडेक्स संकेत का उपयोग करने के लिए क्वेरी बदलता हूं, तो क्वेरी 50ms में निष्पादित होती है:
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WITH(INDEX(CommonQueryIndex))
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'
एक सही ढंग से चयनात्मक DeviceID क्लॉज जोड़ने से 50ms रेंज हिट होती है:
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]
मूल क्वेरी में जोड़ता हूं , तो मैं 50ms की सीमा में हूं:
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
एक संकेत का उपयोग करना चाहिए ?