एक मैचिंग फ़ील्ड के साथ सभी पूर्व रिकॉर्ड की कुल संख्या का पता लगाने के लिए एक सबक्वेरी का उपयोग करते समय, प्रदर्शन एक मेज पर भयानक होता है जिसमें 50k रिकॉर्ड होते हैं। सबक्वेरी के बिना, क्वेरी कुछ मिलीसेकंड में निष्पादित होती है। उपकुंजी के साथ, निष्पादन का समय एक मिनट से ऊपर है।
इस प्रश्न के लिए, परिणाम:
- किसी दिए गए दिनांक सीमा के भीतर केवल उन रिकॉर्ड्स को शामिल करें।
- तिथि सीमा की परवाह किए बिना, वर्तमान रिकॉर्ड सहित सभी पूर्व रिकॉर्ड्स की एक संख्या शामिल करें।
बेसिक टेबल स्कीमा
Activity
======================
Id int Identifier
Address varchar(25)
ActionDate datetime2
Process varchar(50)
-- 7 other columns
उदाहरण डेटा
Id Address ActionDate (Time part excluded for simplicity)
===========================
99 000 2017-05-30
98 111 2017-05-30
97 000 2017-05-29
96 000 2017-05-28
95 111 2017-05-19
94 222 2017-05-30
अपेक्षित परिणाम
की तिथि सीमा के 2017-05-29
लिए2017-05-30
Id Address ActionDate PriorCount
=========================================
99 000 2017-05-30 2 (3 total, 2 prior to ActionDate)
98 111 2017-05-30 1 (2 total, 1 prior to ActionDate)
94 222 2017-05-30 0 (1 total, 0 prior to ActionDate)
97 000 2017-05-29 1 (3 total, 1 prior to ActionDate)
रिकॉर्ड 96 और 95 को परिणाम से बाहर रखा गया है, लेकिन PriorCount
उपनगर में शामिल किया गया है
वर्तमान क्वेरी
select
*.a
, ( select count(*)
from Activity
where
Activity.Address = a.Address
and Activity.ActionDate < a.ActionDate
) as PriorCount
from Activity a
where a.ActionDate between '2017-05-29' and '2017-05-30'
order by a.ActionDate desc
वर्तमान सूचकांक
CREATE NONCLUSTERED INDEX [IDX_my_nme] ON [dbo].[Activity]
(
[ActionDate] ASC
)
INCLUDE ([Address]) WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
)
सवाल
- इस क्वेरी के प्रदर्शन को बेहतर बनाने के लिए किन रणनीतियों का उपयोग किया जा सकता है?
संपादित करें 1
इस सवाल के जवाब में कि मैं DB पर क्या संशोधित कर सकता हूं: मैं अनुक्रमणिका को संशोधित कर सकता हूं, केवल तालिका संरचना नहीं।
संपादित करें 2
मैंने अब Address
कॉलम पर एक मूल सूचकांक जोड़ा है , लेकिन इसमें बहुत सुधार नहीं हुआ। मैं वर्तमान में एक अस्थायी तालिका बनाने PriorCount
और उसके बिना मूल्यों को सम्मिलित करने और फिर प्रत्येक पंक्ति को उनके विशिष्ट गणनाओं के साथ अपडेट करने के साथ बहुत बेहतर प्रदर्शन पा रहा हूं ।
3 संपादित करें
सूचकांक स्पूल जो ऑब्बिश (स्वीकृत उत्तर) पाया गया मुद्दा था। एक बार जब मैंने एक नया जोड़ा nonclustered index [xyz] on [Activity] (Address) include (ActionDate)
, क्वेरी समय एक मिनट से ऊपर एक सेकंड से भी कम समय के लिए एक अस्थायी तालिका (2 संपादित देखें) का उपयोग किए बिना नीचे चला गया।
nonclustered index [xyz] on [Activity] (Address) include (ActionDate)
, तो क्वेरी का समय एक मिनट से ऊपर एक सेकंड से भी कम हो जाता है। +10 अगर मैं कर सका। धन्यवाद!