मैं इस 20 मिलियन रिकॉर्ड दृश्य को तेजी से कैसे क्वेरी करूं?


14

एक खोज कार्यक्षमता के लिए मैं एक ऐसे दृश्य का उपयोग कर रहा हूं जिसमें सभी तालिकाओं से रिकॉर्ड हैं जिनके भीतर मुझे खोज करने की आवश्यकता है। दृश्य में लगभग 20 मिलियन रिकॉर्ड हैं। इस दृश्य के विरुद्ध खोज में बहुत अधिक समय लग रहा है।

मुझे इस दृश्य के प्रदर्शन को बेहतर बनाने के लिए कहां देखना चाहिए?

दृश्य के लिए किसी न किसी की परिभाषा नीचे है। इसमें तेरह टेबल और लगभग तीस खेत शामिल हैं।

CREATE VIEW [dbo].[v_AllForSearch]
AS
SELECT 
  FT.firstField AS [firstField]
, FT.fld_primary AS [fld_primary]
, FT.fld_thirdField AS [thirdField]
, FT.fld_fourthField AS [fourthField]           
, ISNULL(ST.[fld_firstSearchField],'') AS [firstSearchField]
, ISNULL(TT.[fld_thirdSearch],'') AS thirdSearch
, ISNULL(TT.[fld_fourthSearch],'')AS fourthSearch
, ISNULL(TT.[fld_fifthSearch],'')AS fifthSearch
, ISNULL(FRT.[fld_sixthSearch],'') As [sixthSearch]
, ISNULL(FRT.[fld_seventhSearch],'') AS [seventhSearch]
, ISNULL(FRT.[fld_eightSearch],'')AS [eightSearch]
, ISNULL(FIT.[fld_nineSearch],'') AS [nineSearch]
, ISNULL(SIT.[fld_tenthSearch],'')AS [tenthSearch]
, ISNULL(SET.[fld_eleventhSearch],'') AS [eleventhSearch]
, ISNULL(ET.[twelthSearch],'')AS [twelthSearch]
, ISNULL(NT.[thirteenthSearch],'')AS [thirteenthSearch]
, ISNULL(NT.[fourteenSearch],'') AS [fourteenSearch]
, ISNULL(NT.[fifteenSearch],'') AS [fifteenSearch]
, ISNULL(NT.[sxteenSearch],'')  AS [sxteenSearch]
, ISNULL(NT.[seventeenSearch],'') AS [seventeenSearch]
, ISNULL(NT.[eighteenSearch],'')AS [eighteenSearch]
, ISNULL(TT.[ninteenSearch],'') AS [ninteenSearch]
, ISNULL(ELT.[twentySearch],'') AS [twentySearch]
, ISNULL(ELT.[twentyOneSearch],'') AS [twentyOneSearch]
, ISNULL(TWT.[twentyTwoSearch],'') AS [twentyTwoSearch]
, ISNULL(THT.twentyThree,'') AS [twentyThree]
, ISNULL(THT.twentyFour,'') AS [twentyFour]
, ISNULL(THT.twentyFive,'') AS [twentyFive]
, ISNULL(THT.twentySix,'') AS [twentySix]
FROM 
      tblFirstTable AS FT         
      LEFT JOIN [tblSecondTable] AS ST 
            ON ST.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblThirdTable] AS TT 
            ON TT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblFourthTable] AS FRT 
            ON FRT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblFifthTable] AS FIT 
            ON FIT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblSixthTable] AS SIT 
            ON SIT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblSeventhTable] AS SET 
            ON SET.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblEighthTable] AS ET 
            ON ET.[fld_primary] = FT.[fld_primary] 
      LEFT JOIN [tblNinthTable] AS NT 
            ON NT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblELTnthTable] AS TT 
            ON TT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblEleventhTable] AS ELT 
            ON ELT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblTwelthTable] AS TWT 
                            ON TWT.[fld_id] = ELT.[fld_id]  
              LEFT JOIN [tblThirteenthTable] AS THT
            ON THT.[firstField]= FT.[firstField]
WHERE fld_Status ..

जवाबों:


9

एक दृश्य स्थूल है जो फैलता है। इसलिए यदि आपका दृश्य 2 तालिकाओं का JOIN है, तो निष्पादन योजना 2 तालिकाओं को दिखाएगी। दृश्य पारदर्शी है।

यदि दृश्य अनुक्रमित / भौतिकीकृत है तो यह लागू नहीं होता है। हालाँकि तब आप यह सवाल नहीं पूछेंगे।

तो, निष्पादन योजना क्या कहती है? डीटीए? अनुक्रमणिका dmv क्वेरी गुम है? सबसे महंगी dmv क्वेरी?


वह भौतिक दृष्टि से प्रश्न पूछ सकता है, और यह महसूस नहीं करता है कि यह आम तौर पर सिर्फ एक और तालिका के रूप में लागू किया जाता है, इसलिए अनुक्रमित किया जा सकता है, आदि
जो

@ जो: संभवत:, लेकिन तब ओपी मदद नहीं मांग रहा था अगर वे मतभेद जानते थे ...
gbn

प्रश्न "भौतिक विचारों" के बजाय एमएस एसक्यूएल सर्वर के लिए टैग किया गया है, जिसे हम "अनुक्रमित विचारों" के बारे में बात कर रहे हैं;)
एंड्रयूक्यू

1
@AndrewSQL: मैंने किया। लेकिन हमें निचले जीवन रूपों के लिए पूरा करना चाहिए ...
gbn

6

दृश्य और तालिकाओं के बारे में अधिक जानकारी के बिना उत्तर "यह निर्भर करता है" है, लेकिन आप उन क्षेत्रों के लिए अपने दृश्य के WHERE खंड को देखना शुरू कर सकते हैं जिनके लिए अनुक्रमित की आवश्यकता हो सकती है।


1
लेकिन मैं धारणा है कि सामान्य रूप में देखा गया अनुक्रमित से काफी लाभ नहीं है के तहत किया गया (... "मैं इस आदमी ने कहा था मुझे पता है" के अनुसार)
jcolebrand

5
@jcolebrand: सामान्य तौर पर विचारों को अनुक्रमणिका द्वारा बहुत मदद की जाती है, यह इस बात पर निर्भर करता है कि उनका उपयोग कैसे किया जाता है। अनिवार्य रूप से किसी दिए गए क्वेरी में उपयोग किए जाने पर वे लाभान्वित होंगे जैसे कि उनके कोड को सीधे क्वेरी में डाला गया था। सरल विचारों + प्रश्नों के लिए इसका अर्थ है कि वे अनुक्रमित के साथ-साथ किसी भी सरल क्वेरी का उपयोग करेंगे। अधिक जटिल विचारों / प्रश्नों के लिए, यह निर्भर करता है कि क्वेरी प्लानर किस कार्य को पुनर्व्यवस्थित और अनुकूलित कर सकता है। इसे देखने का सबसे अच्छा तरीका एक बड़े डेटासेट को चुनना है और उनका उपयोग करते हुए कुछ उदाहरण दृश्य और प्रश्नों का निर्माण करना है, और देखें कि एसएसएमएस की क्वेरी योजना का प्रदर्शन क्या कहता है कि क्यूपी उनके साथ क्या करता है।
डेविड स्पिललेट

6

दूसरों ने जो कहा है (इसके अलावा, INDEXes जो आपकी मदद कर सकता है) के अलावा, मैं सुझाव देता हूं कि आप अनुक्रमित विचारों पर विचार करना चाहते हैं - यह मानते हुए कि दृश्य ( विवरण ) पर अनुक्रमणिका बनाना संभव है । तब आप अपने प्रश्नों ( विवरण ) में NOEXPAND संकेत भी लागू कर सकते हैं ।


ये विवरण आशाजनक लगता है। मुझे उन लोगों की कोशिश करो और परिणामों पर वापस मिल जाएगा।
बालू

4

जेनेरिक जवाब निष्पादन योजना पर एक नज़र रखना है। क्या आपके जोड़ अनुक्रमित हैं? क्या आपके आउटपुट फ़ील्ड उन अनुक्रमित में शामिल हैं? क्या आप केवल उन कॉलमों को आउटपुट कर रहे हैं जिन्हें आपको देखने की आवश्यकता है?


0

मैं शायद क्या करूंगा, केवल 2 दृश्य बना रहा हूं

  • पहला दृश्य सिर्फ उन क्षेत्रों का है, जिन्हें मुझे खोजना है; बस उन क्षेत्रों। मैं प्रत्येक पंक्ति के लिए आईडी फ़ील्ड लौटाऊंगा, साथ ही आपकी खोज किस प्रकार की तालिका होगी। मैंने एक समान कार्य किया जिससे कि सभी तालिकाओं को खोजा गया एक UNION ALL दृश्य बना। मैंने सिर्फ आईडी, प्रकार और पाठ फ़ील्ड शामिल करना सुनिश्चित किया, मैं खोजना चाहता था।

  • दूसरा दृश्य 1 दृश्य में एकत्रित किए गए परिणामों को प्रदर्शित करने का काम करेगा, और आपके पास परिणाम प्रदर्शित करने के लिए आवश्यक प्रत्येक तालिका होगी, या शायद एक दृश्य के बजाय, इसे संग्रहीत कार्यविधि बना दें।

मैं सबसे नीचे एक ग्रुप के साथ एक UNION ALL करूंगा, और मैं उन सभी LEFT OUTER JOINs को नहीं करूंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.