2015-09-24 8 views
6

मैं Azure एसक्यूएल डाटाबेस में एक v12 सर्वर का उपयोग कर रहा हूँ के साथ वर्तमान क्वेरी तेजी लाने के लिए, और मैं निम्न तालिका है:कैसे सूचकांक

CREATE TABLE [dbo].[AudienceNiches]( [Id] [bigint] IDENTITY(1,1) NOT NULL, [WebsiteId] [nvarchar](128) NOT NULL, [VisitorId] [nvarchar](128) NOT NULL, [VisitDate] [datetime] NOT NULL, [Interest] [nvarchar](50) NULL, [Gender] [float] NULL, [AgeFrom18To24] [float] NULL, [AgeFrom25To34] [float] NULL, [AgeFrom45To54] [float] NULL, [AgeFrom55To64] [float] NULL, [AgeFrom65Plus] [float] NULL, [AgeFrom35To44] [float] NULL, CONSTRAINT [PK_AudienceNiches] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) )

मैं इस क्वेरी को क्रियान्वित कर रहा हूँ: (अपडेट क्वेरी)

idx_WebsiteId_VisitDate_VisitorId idx_WebsiteId_VisitDate idx_VisitorId idx_Interest

:

`select a.interest, count(interest) from (
select visitorid, interest 
from audienceNiches 
WHERE WebsiteId = @websiteid 
AND VisitDate >= @startdate 
AND VisitDate <= @enddate 
group by visitorid, interest) as a 
group by a.interest` 

और मैं निम्नलिखित indexs (सभी एएससी) है

समस्या यह है कि मेरी क्वेरी 18K पंक्तियों को aproximaly लौटाती है और 5 सेकंड लेती है, पूरी तालिका में 8.8M रिकॉर्ड होते हैं, और यदि मैं थोड़ा डेटा बढ़ाता हूं तो समय बहुत बढ़ जाता है, तो, इस क्वेरी के लिए सबसे अच्छा सूचकांक क्या होगा ? मुझे क्या याद आ रहा है

+0

परिणामस्वरूप डेटा कैसा दिखने की उम्मीद है? मुझे यकीन नहीं है कि यदि आप VisitorID द्वारा समूहित कर रहे हैं तो कुल कार्य अधिक कैसे करते हैं। –

+0

मैंने क्वेरी को अपडेट किया है, इसलिए कुछ और आसान हासिल किया जा सकता है, मैं प्रति रुचि चाहता हूं कि आगंतुकों की कुल संख्या –

+0

वेबसाइट प्राथमिक प्राथमिक है ?? मुझे लगता है कि आप WebsiteId = @websiteid – User2012384

उत्तर

2

इस प्रश्न के लिए सबसे अच्छा सूचकांक इन स्तंभों पर एक समग्र सूचकांक में इस क्रम में है:

  • WebsiteId
  • VisitDate
  • ब्याज
  • visitorId

यह क्वेरी को पूरी तरह उत्तर देने की अनुमति देता है अनुक्रमणिका। SqlServer (WebsiteId, VisitDate) पर स्कैन रेंज कर सकते हैं और उसके बाद अशक्त Interest को बाहर और अंत में सभी इंडेक्स से गिनती अलग VisitorIds। इन परिचालनों को कुशलता से होने की अनुमति देने के लिए इंडेक्स प्रविष्टियां सही क्रम में होंगी।

+0

धन्यवाद, मुझे समग्र इंडेक्स के बारे में पता नहीं था, मुझे लगता है कि आप INCLUDE() के बारे में बात कर रहे थे इंडेक्स बनाते समय विकल्प, इसलिए मैंने रुचि और विज़िटर आईडी को शामिल और वेबसाइटिड में रखा और ऑन क्लॉज में विज़िट किया! वह चाल बनाओ! –

1

इंडेक्स समझ की एक लगभग अनंत राशि की आवश्यकता होती है सकते हैं, लेकिन आपके मामले में मुझे लगता है कि आप WebsiteId और VisitDate अलग अनुक्रमित के रूप में का अनुक्रमण द्वारा अच्छा प्रदर्शन लाभ देखना होगा।

यह सुनिश्चित करना महत्वपूर्ण है कि आपकी अनुक्रमणिका अच्छी तरह से हो। आपको आंकड़ों को अद्यतित रखने और समय-समय पर अपनी अनुक्रमणिका का पुनर्निर्माण करके उन्हें बनाए रखने की आवश्यकता है।

अंत में, आप क्वेरी योजना जब ट्यूनिंग क्वेरी प्रदर्शन जांच करनी चाहिए। एसक्यूएल सर्वर आपको बताएगा कि क्या ऐसा लगता है कि यह अनुक्रमित होने वाले कॉलम (या कॉलम) से लाभान्वित होगा, और आपको अन्य प्रदर्शन संबंधी मुद्दों से भी सतर्क करेगा।

प्रेस Ctrl + L प्रबंधन स्टूडियो के भीतर और से क्या क्वेरी के साथ हो रहा है देखते हैं।

+1

है यह उत्तर बस गलत है। ओपी के पास इस प्रश्न के लिए एक बहुत अच्छी अनुक्रमणिका है, उस क्रम में '(वेबसाइट आईडी, विज़िटडेट, विज़िटर आईडी) पर समग्र सूचकांक। –

+0

परीक्षण के उद्देश्य के लिए, मैं विज़िट इंडेक्स को अलग कर रहा हूं, इंडेक्स खत्म होने पर मैं अपडेट करूंगा –

+0

क्वेरी निष्पादन योजना चलाने के लिए मत भूलना और देखें कि यह आपको कोई संकेत देता है या नहीं। प्रतिबिंब पर यह एक समग्र सूचकांक के रूप में बेहतर हो सकता है, लेकिन आपको क्वेरी प्लान परिणाम (Ctrl + L) द्वारा निर्देशित किया जाना चाहिए। आपको एक स्क्रीनशॉट पोस्ट करने के लिए इसे समझने में मदद की ज़रूरत है। –

2

यह मुश्किल है मेरे डेटा के खिलाफ परीक्षण करने के लिए बिना एसक्यूएल लिखने के लिए है, लेकिन देखना है कि अगर यह परिणाम आप एक बेहतर निष्पादन समय के साथ की तलाश में हैं देता है के लिए।

SELECT interest, count(distinct visitorid) 
FROM audienceNiches 
WHERE WebsiteId = @websiteid 
AND VisitDate between @startdate and @enddate 
AND interest is not null 
GROUP BY interest 
+0

क्योंकि 'ब्याज' शून्य हो सकता है, यह एक अलग उत्तर वापस कर सकता है। –

+0

ब्याज कॉलम में एक शून्य जांच जोड़ा गया। अपनी संशोधित क्वेरी के आधार पर, मुझे नहीं लगता कि वह उन आगंतुकों में रूचि रखता है जिनके पास रुचि नहीं थी। –

+0

इस वास्तविकता के प्रदर्शन को निष्पादित करने में बहुत अधिक समय लगता है, ऐसा लगता है कि समूह का उपयोग करना अधिक प्रभावी है, अभी तक सुनिश्चित नहीं है –

1

आपकी क्वेरी, इस तरह से लिखा जा सकता है, क्योंकि अंतिम परिणाम में सेट आप तालिका audienceNiches से स्तंभ visitorId खींच नहीं है, इसलिए द्वारा समूह के दो अलग-अलग स्तर लिखने के लिए कोई जरूरत नहीं। इस क्वेरी के साथ जांचें और मुझे अभी भी प्रदर्शन समस्या का सामना करने के बारे में बताएं।

select interest, count(interest) 
from audienceNiches 
WHERE WebsiteId = @websiteid 
AND VisitDate >= @startdate 
AND VisitDate <= @enddate 
group by interest 
+0

लेकिन अगर मेरे पास एक विज़िटरिड है जिसमें दो बार समान रुचि है? मैं उन्हें अपनी गिनती में डुप्लिकेट कर दूंगा, ऐसा इसलिए है क्योंकि उपयोगकर्ता के जीवनकाल में रुचि के दो अलग-अलग मूल्य हो सकते हैं। –

0

सबसे पहले, अपने अद्यतन क्वेरी प्रभावी रूप से इस करने के लिए कम किया जा सकता है:

select an.Interest, count(an.Interest) 
from dbo.AudienceNiches an 
where an.WebsiteId = @WebSiteId 
    and an.VisitDate between @startdate and @enddate 
group by an.Interest; 

दूसरा, अपने डेटा है, तो निम्न सूचकांकों बेहतरीन प्रदर्शन के प्रदान करेगा में से एक की प्रमुखता के आधार पर:

create index IX_AudienceNiches_WebSiteId_VisitDate_Interest on dbo.AudienceNiches 
(WebSiteId, VisitDate, Interest); 

या

create index IX_AudienceNiches_VisitDate_WebSiteId_Interest on dbo.AudienceNiches 
(VisitDate, WebSiteId, Interest); 

चूंकि आपका डेटा बढ़ेगा, हालांकि, मुझे लगता है कि आखिर में बाद वाला व्यक्ति औसतन अधिक कुशल बन जाएगा।

पीएस आपकी तालिका को कई पहलुओं में गंभीर रूप से denormalised है। मुझे उम्मीद है कि आप जानते हैं कि आप क्या कर रहे हैं।

+0

धन्यवाद roger, मुझे अब बेहतर प्रदर्शन मिला है लेकिन बात यह है कि मेरे पास जोड़ी ब्याज <-> मेरे परिणाम में विज़िटर डुप्लीकेट नहीं हो सकता है। –