Database
 sql >> डेटाबेस >  >> RDS >> Database

ट्रेस फ्लैग 2389 और नया कार्डिनैलिटी अनुमानक

SQL सर्वर ट्रेस फ़्लैग्स में से एक जो कुछ समय के लिए आसपास रहा है वह 2389 है।  इसकी अक्सर 2390 के साथ चर्चा की जाती है, लेकिन मैं इस पोस्ट के लिए केवल 2389 पर ध्यान केंद्रित करना चाहता हूं। ट्रेस फ्लैग को SQL Server 2005 SP1 में पेश किया गया था, जिसे 18 अप्रैल, 2006 को जारी किया गया था (http://sqlserverbuilds.blogspot.co.uk/ के अनुसार), इसलिए यह लगभग 10 वर्षों से अधिक समय से है। ट्रेस फ़्लैग्स इंजन के व्यवहार को बदलते हैं, और 2389 ऑप्टिमाइज़र को उन आँकड़ों की पहचान करने की अनुमति देता है जो आरोही हैं और उन्हें इस तरह से ब्रांड करते हैं (जिसे अक्सर "आरोही प्रमुख समस्या" कहा जाता है)। जब ऐसा होता है, तो आँकड़ों को क्वेरी संकलन समय पर स्वचालित रूप से अपडेट किया जाएगा, जिसका अर्थ है कि अनुकूलक के पास तालिका में उच्चतम मान के बारे में जानकारी होती है (उस समय की तुलना में जब ट्रेस ध्वज का उपयोग नहीं किया जाता है)।

मैंने हाल ही में एक क्लाइंट के साथ इस ट्रेस फ्लैग का उपयोग करने के बारे में चर्चा की थी, और यह इस प्रकार के परिदृश्य के कारण सामने आया:

  • आपके पास एक बड़ी तालिका है जिसमें प्राथमिक कुंजी के रूप में एक INT है, और यह क्लस्टर है।
  • आपके पास एक गैर-संकुल अनुक्रमणिका है जो DATETIME स्तंभ पर ले जाती है।
  • तालिका में लगभग 20 मिलियन पंक्तियाँ हैं, और कहीं भी 5,000 से 100,000 पंक्तियाँ प्रतिदिन जोड़ी जाती हैं।
  • आंकड़े आपके रखरखाव कार्य के हिस्से के रूप में रात में अपडेट किए जाते हैं।
  • डेटाबेस के लिए ऑटो-अपडेट आंकड़े सक्षम हैं, लेकिन अगर तालिका में 100,000 पंक्तियां जोड़ दी जाती हैं, तो यह स्वचालित अपडेट को लागू करने के लिए आवश्यक 4 मिलियन पंक्तियों (20%) से कम है।
  • जब उपयोगकर्ता विधेय में दिनांक का उपयोग करके तालिका को क्वेरी करते हैं, तो क्वेरी का प्रदर्शन बहुत अच्छा हो सकता है, या यह भयानक हो सकता है।

वह आखिरी गोली लगभग इसे एक पैरामीटर संवेदनशीलता समस्या की तरह लगती है, लेकिन ऐसा नहीं है। इस मामले में, यह एक सांख्यिकी मुद्दा है। क्लाइंट को मेरा सुझाव टीएफ 2389 का उपयोग करना था, या दिन भर में अधिक बार आंकड़े अपडेट करना था (उदाहरण के लिए एजेंट जॉब के माध्यम से)। तब मैंने सोचा कि मैं कुछ परीक्षण करूंगा, क्योंकि क्लाइंट SQL Server 2014 चला रहा था।  यहीं चीजें दिलचस्प हुईं।

सेटअप

हम वाइडवर्ल्ड इम्पोर्टर्स डेटाबेस के भीतर SQL सर्वर 2016 के RTM बिल्ड में परीक्षण के लिए उपरोक्त तालिका बनाने जा रहे हैं, और मैं शुरू में संगतता मोड को 110 पर सेट करने जा रहा हूँ:

उपयोग [मास्टर];गोरस्टोर डेटाबेस [वाइडवर्ल्ड इम्पोर्टर्स] डिस्क से =एन'सी:\ बैकअप \ वाइडवर्ल्ड इम्पोर्टर्स-फुल.बक' फाईल =1, एन'डब्ल्यूडब्ल्यूआई_प्राइमरी' को एन'सी पर ले जाएं:\ डेटाबेस \ वाइडवर्ल्ड इम्पोर्टर्स \ वाइडवर्ल्ड इम्पोर्टर्स .mdf', N'WWI_UserData' को N'C:\Databases\WideWorldImporters\WideWorldImporters_UserData.ndf' पर ले जाएँ, N'WWI_Log' को N'C पर ले जाएँ:\Databases\WideWorldImporters\WideWorldImporters.ldf',MOVE N'WWI_ TO INMemory N'C:\Databases\WideWorldImporters\WideWorldImporters_InMemory_Data_1', NOUNLOAD, REPLACE, STATS =5; GO ALTER DATABASE [WideWorldImporters] SET COMPATIBILITY_LEVEL =110; GO USE [WideWorldImporters]; ] [इंट] नॉट न्यूल, [कस्टमर आईडी] [इंट] नॉट न्यूल, [सेल्सपर्सन आईडी] [इंट] नॉट न्यूल, [पिक्डबाइपर्सनआईडी] [इंट] न्यूल, [कॉन्टैक्टपर्सनआईडी] [इंट] नॉट न्यूल, [बैकऑर्डर ऑर्डर आईडी] [इंट] न्यूल, [आदेश दिनांक] [तारीख] शून्य नहीं, [अपेक्षित डिलीवरी दिनांक] [तारीख] शून्य नहीं, [ग्राहक खरीद आदेश संख्या] [nvarchar] (20) शून्य, [IsUndersupplyBackordered] [बिट] शून्य नहीं, [टिप्पणियां] [nvarchar ](अधिकतम) नल, [डिलीवरी निर्देश] [nvarchar] (अधिकतम) नल, [आंतरिक टिप्पणियाँ] [nvarchar] (अधिकतम) नल, [चुनना पूर्ण जब] [डेटाटाइम 2] (7) नल, [अंतिम संपादित द्वारा] [int] पूर्ण नहीं, [अंतिम संपादित कब ] [डेटाटाइम 2] (7) नॉट न्यूल, कॉन्स्ट्रेंट [पीके_सेल्स_बिगऑर्डर्स] प्राथमिक कुंजी क्लस्टर ([ऑर्डरआईडी] एएससी) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS) _ ON_ROW_LOCKS) [USERDATA] TEXTIMAGE_ON [USERDATA] पर;

इसके बाद हम लगभग 24 मिलियन पंक्तियों को BigOrders में लोड करने जा रहे हैं, और OrderDate पर एक गैर-संकुल अनुक्रमणिका बनाएंगे।

नोकाउंट चालू करें; DECLARE @Loops SMALLINT =0, @IDIncrement INT =75000; जबकि @Loops <325 -- जोड़ी गई पंक्तियों की संख्या बढ़ाने या घटाने के लिए इसे समायोजित करेंBEGINSERT [बिक्री]। [आदेश दिनांक], [अपेक्षित वितरण दिनांक], [ग्राहक खरीद आदेश संख्या], [IsUndersupplyBackordered], [टिप्पणियां], [वितरण निर्देश], [आंतरिक टिप्पणियां], [पूरा होने पर चयन करना], [अंतिम संपादित, ग्राहक आईडी], [अंतिम आदेश आईडी] + चयन करें [अंतिम आदेश, ग्राहक आईडी] ], [सेल्सपर्सन आईडी], [पिकडबायपर्सन आईडी], [संपर्क व्यक्ति आईडी], [बैकऑर्डर ऑर्डर आईडी], [ऑर्डरडेट], [अपेक्षित डिलीवरी तिथि], [ग्राहक खरीद ऑर्डर नंबर], [इस अंडरसप्लाई बैकऑर्डर], [टिप्पणियां], [डिलीवरी इंस्ट्रक्शन], [डिलीवरी इंस्ट्रक्शन], [डिलीवरी इंस्ट्रक्शन] [अंतिम संपादित द्वारा], [अंतिम संपादित कब] [बिक्री] से। [आदेश]; चौकी; SET @Loops =@Loops + 1; SET @IDIncrement =@IDIncrement + 75000; एंड नॉनक्लस्टर्ड इंडेक्स बनाएं [NCI_BigOrders_OrderDate] ऑन [सेल्स]। [बिगऑर्डर्स] ([ऑर्डरडेट], कस्टमरआईडी);

यदि हम गैर-संकुल सूचकांक के लिए हिस्टोग्राम की जांच करते हैं, तो हम देखते हैं कि उच्चतम तिथि 2016-05-31 है:

DBCC SHOW_STATISTICS ('Sales.BigOrders',[NCI_BigOrders_OrderDate]);


आदेश दिनांक पर NCI के लिए आँकड़े

अगर हम उससे आगे की किसी तारीख के बारे में पूछते हैं, तो पंक्तियों की अनुमानित संख्या पर ध्यान दें:

ग्राहक आईडी, ऑर्डर आईडी, विक्रेता व्यक्ति आईडी [बिक्री] से चुनें। [बिग ऑर्डर] जहां [ऑर्डरडेट] ='2016-06-01';


हिस्टोग्राम में जो कुछ भी है उससे आगे की तारीख के लिए पूछताछ करते समय योजना बनाएं

यह 1 है, क्योंकि मान हिस्टोग्राम के बाहर है। और इस मामले में, यह ठीक है, क्योंकि 31 मई, 2016 के बाद तालिका में कोई पंक्तियाँ नहीं हैं।  लेकिन चलिए कुछ जोड़ते हैं और फिर उसी क्वेरी को फिर से चलाते हैं:

इन्सर्ट [सेल्स]। ], [टिप्पणियां], [डिलीवरी निर्देश], [आंतरिक टिप्पणियां], [पिकिंग पूर्ण होने पर], [अंतिम संपादित द्वारा], [अंतिम संपादित कब]) चुनें [ऑर्डर आईडी] + 25000000, [ग्राहक आईडी], [विक्रेता व्यक्ति आईडी], [चुना हुआ व्यक्ति आईडी], [संपर्क व्यक्ति आईडी],[ बैकऑर्डर ऑर्डर आईडी], '2016-06-01', [अपेक्षित डिलीवरी की तारीख], [ग्राहक खरीद ऑर्डर संख्या], [इस अंडरसप्लाई बैकऑर्डर किया गया है], [टिप्पणियां], [डिलीवरी निर्देश], [आंतरिक टिप्पणियां], [चुनना पूर्ण होने पर], [अंतिम संपादित जब से], [अंतिम संपादित किया गया]] .[ऑर्डर];GO SELECT CustomerID, OrderID, SalespersonIDFROM [Sales].[BigOrders]WHERE [OrderDate] ='2016-06-01';


31 मई के बाद की पंक्तियों को जोड़ने के बाद योजना बनाएं

पंक्तियों की अनुमानित संख्या अभी भी 1 है। लेकिन यह वह जगह है जहाँ चीजें दिलचस्प होती हैं। आइए संगतता मोड को 130 में बदलें ताकि हम नए कार्डिनैलिटी अनुमानक का उपयोग करें और देखें कि क्या होता है।

यूज [मास्टर]; GO ALTER DATABASE [WideWorldImporters] SET COMPATIBILITY_LEVEL =130GO USE [WideWorldImporters];GO SELECT CustomerID, OrderID, SalespersonIDFROM [Sales]।[BigOrders]WHERE [OrderDate] ='2016-06-01'; 


नए सीई का उपयोग करके 1 जून के लिए पंक्तियां जोड़ने के बाद योजना बनाएं

हमारी योजना का आकार वही है, लेकिन अब हमारा अनुमान 4,898 पंक्तियों का है। नया सीई इतिहास के बाहर के मूल्यों को पुराने सीई से अलग मानता है। तो… क्या हमें ट्रेस फ्लैग 2389 की भी आवश्यकता है?

परीक्षा - भाग I

पहले परीक्षण के लिए, हम संगतता मोड 110 में बने रहेंगे और 2389 के साथ हम जो देखेंगे उसके माध्यम से चलते हैं। इस ट्रेस ध्वज का उपयोग करते समय आप इसे SQL सर्वर सेवा में स्टार्टअप पैरामीटर के रूप में सक्षम कर सकते हैं, या आप DBCC का उपयोग कर सकते हैं TRACEON इसे इंस्टेंस-वाइड सक्षम करने के लिए। समझें कि आपके उत्पादन परिवेश में, यदि आप ट्रेस फ़्लैग को सक्षम करने के लिए DBCC TRACEON का उपयोग करते हैं, तो इंस्टेंस के पुनरारंभ होने पर ट्रेस फ़्लैग प्रभावी नहीं होगा।

ट्रेस फ्लैग सक्षम होने के साथ, ऑप्टिमाइज़र द्वारा इसे आरोही के रूप में ब्रांड करने से पहले एक आंकड़े को तीन (3) बार अपडेट करना होगा। हम अच्छे माप के लिए चार अपडेट लागू करेंगे और प्रत्येक अपडेट के बीच में और पंक्तियां जोड़ेंगे।

यूज [मास्टर]; GO ALTER DATABASE [WideWorldImporters] SET COMPATIBILITY_LEVEL =110;GO DBCC TRACEON (2389, -1); GO USE [WideWorldImporters];GO UPDATE Statistics [Sales]।[BigOrders] [NCI_BigOrders;GOOrderDate] INSERT [बिक्री]। टिप्पणियाँ], [डिलीवरी निर्देश], [आंतरिक टिप्पणियां], [पिकिंग पूर्ण होने पर], [अंतिम संपादित द्वारा], [अंतिम संपादित कब]) चुनें [ऑर्डर आईडी] + 25100000, [ग्राहक आईडी], [विक्रेता व्यक्ति आईडी], [पिकडबायपर्सन आईडी], [संपर्कपर्सन आईडी], [बैकऑर्डर ऑर्डर आईडी] '2016-06-02', [अपेक्षित डिलीवरी की तारीख], [ग्राहक खरीद आदेश संख्या], [इस अंडरसप्लाई बैकऑर्डर किया गया], [टिप्पणियां], [डिलीवरी निर्देश], [आंतरिक टिप्पणियां], [पिकिंग पूर्ण होने पर], [अंतिम संपादित द्वारा], [अंतिम संपादित किए गए]। [आदेशों से] ]; अद्यतन आँकड़े [बिक्री]। [बिगऑर्डर] [NCI_BigOrders_OrderDate]; INSERT [बिक्री] जाएं। ], [सेल्सपर्सन आईडी], [पिकडबायपर्सन आईडी], [संपर्क व्यक्ति आईडी], [बैकऑर्डर ऑर्डर आईडी], [ऑर्डरडेट], [अपेक्षित डिलीवरी डेट], [ग्राहक खरीद ऑर्डर नंबर], [इस अंडरसप्लाई बैकऑर्डर], [टिप्पणियां], [डिलीवरी इंस्ट्रक्शन], [डिलीवरी इंस्ट्रक्शन], [डिलीवरी इंस्ट्रक्शन] [LastEditedBy][LastEditedwhen])SELECT[OrderID] + 25200000,[CustomerID],[SalespersonID],[PickedByPersonID],[ContactPersonID],[BackorderOrderID],'2016-06-03',[ExpectedDeliveryDate],[OrderNumberchase] [IsUndersupplyBackordered], [टिप्पणियां], [डिलीवरी निर्देश], [आंतरिक टिप्पणियाँ], [PickingCompletedwhen], [LastEditedBy], [LastEdited जब] [बिक्री] से। [आदेश]; अद्यतन आँकड़े [बिक्री]। जाओ INSERT [बिक्री]। [टिप्पणियां], [डिलीवरी निर्देश], [आंतरिक टिप्पणियां], [पिकिंग पूर्ण होने पर], [अंतिम संपादित द्वारा] , [अंतिम संपादित कब]) चुनें [आदेश आईडी] + 25300000, [ग्राहक आईडी], [विक्रेता व्यक्ति आईडी], [चुना हुआ व्यक्ति आईडी], [संपर्क व्यक्ति आईडी], [बैकऑर्डर आईडी], '2016-06-04', [अपेक्षित डिलीवरी दिनांक], [ग्राहक खरीद आदेश] ], [टिप्पणियां], [डिलीवरी निर्देश], [आंतरिक टिप्पणियां], [पिकिंग पूर्ण होने पर], [अंतिम संपादित द्वारा], [अंतिम संपादित कब] [बिक्री] से। [आदेश]; अद्यतन आंकड़े [बिक्री] पर जाएं। पूर्व> 

यदि हम आँकड़ों की फिर से जाँच करते हैं, और अतिरिक्त जानकारी प्रदर्शित करने के लिए ट्रेस फ़्लैग 2388 का उपयोग करते हैं, तो हम देखते हैं कि आँकड़ा अब आरोही के रूप में चिह्नित है:

DBCC TRACEON (2388);GO DBCC SHOW_STATISTICS ('Sales.BigOrders',[NCI_BigOrders_OrderDate]);


आदेश दिनांक पर NCI को ASC के रूप में चिह्नित किया गया

यदि हम भविष्य की तारीख के लिए पूछताछ करते हैं, जब आंकड़े पूरी तरह से अद्यतित होते हैं, तो हम देखते हैं कि यह अभी भी 1 पंक्ति का अनुमान लगाता है:

ग्राहक आईडी, ऑर्डर आईडी, विक्रेता व्यक्ति आईडी [बिक्री] से चुनें।[बिगऑर्डर]जहां [ऑर्डरडेट] ='2016-06-05';


TF 2389 सक्षम होने के बाद योजना बनाएं, लेकिन हिस्टोग्राम से आगे कोई पंक्ति नहीं है। उन्हें>

अब हम 5 जून के लिए पंक्तियां जोड़ेंगे और फिर से वही क्वेरी चलाएंगे:

इन्सर्ट [सेल्स]। ], [टिप्पणियां], [डिलीवरी निर्देश], [आंतरिक टिप्पणियां], [पिकिंग पूर्ण होने पर], [अंतिम संपादित द्वारा], [अंतिम संपादित कब]) चुनें [ऑर्डर आईडी] + 25400000, [ग्राहक आईडी], [विक्रेता व्यक्ति आईडी], [चुना हुआ बायपर्सन आईडी], [संपर्क व्यक्ति आईडी] बैकऑर्डर ऑर्डर आईडी], '2016-06-05', [अपेक्षित डिलीवरी की तारीख], [ग्राहक खरीद ऑर्डर संख्या], [इस अंडरसप्लाई बैकऑर्डर किया गया है], [टिप्पणियां], [डिलीवरी निर्देश], [आंतरिक टिप्पणियां], [चुनना पूर्ण होने पर], [अंतिम संपादित बिक्री से], [अंतिम संपादित किया गया है] .[ऑर्डर];GO SELECT CustomerID, OrderID, SalespersonIDFROM [Sales].[BigOrders]WHERE [OrderDate] ='2016-06-05';


TF 2389 सक्षम होने के बाद योजना, हिस्टोग्राम से परे 70K+ पंक्तियाँ जोड़ी गईं

हमारा अनुमान अब 1 नहीं है, यह 22,595 है। अब, केवल मनोरंजन के लिए, आइए ट्रेस फ़्लैग को अक्षम करें और देखें कि अनुमान क्या है (मैं प्रक्रिया कैश साफ़ करने जा रहा हूँ, क्योंकि ट्रेस फ़्लैग को अक्षम करने से वर्तमान में कैश में क्या प्रभावित नहीं होगा)।

DBCC TRACEOFF (2389, -1);GO DBCC FREEPROCCACHE;GO SELECT CustomerID, OrderID, SalespersonIDFROM [Sales]।[BigOrders]Where [OrderDate] ='2016-06-05';


TF 2389 के *अक्षम* होने के बाद की योजना, 70K+ पंक्तियों को जोड़ा गया हिस्टोग्राम

इस बार मुझे फिर से 1 पंक्ति का अनुमान मिलता है। भले ही आंकड़े को आरोही के रूप में ब्रांडेड किया गया हो, यदि ट्रेस फ़्लैग 2389 सक्षम नहीं है, तो यह केवल 1 पंक्ति का अनुमान लगाता है जब आप हिस्टोग्राम के बाहर किसी मान के लिए क्वेरी करते हैं।

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

परीक्षा - भाग II

पूरी तरह से होने के लिए, मैं सब कुछ रीसेट करने जा रहा हूं। मैं फिर से डेटाबेस बनाऊंगा, संगतता मोड को 130 पर सेट करूंगा, शुरू में डेटा लोड करूंगा, फिर ट्रेस फ्लैग 2389 चालू करूंगा और बीच-बीच में आंकड़ों के अपडेट के साथ डेटा के तीन सेट लोड करूंगा।

यूज [मास्टर]; GO RESTORE DATABASE [WideWorldImporters] From  DISK =N'C:\Backups\WideWorldImporters-Full.bak' with  FILE =1, N'WWI_Primary' को N'C:\Databases\WideWorldImporters\ WideWorldImporters.mdf', N'WWI_UserData' को N'C:\Databases\WideWorldImporters\WideWorldImporters_UserData.ndf' पर ले जाएँ, N'WWI_Log' को N'C:\Databases\WideWorldImporters\WideWorldImporters N'WWI_MoVE' में ले जाएँ। N'C:\Databases\WideWorldImporters\WideWorldImporters_InMemory_Data_1', NOUNLOAD, REPLACE, STATS =5; GO USE [Master]; GO ALTER DATABASE [WideWorldImporters] SET COMPATIBILITY_LEVEL =130; उपयोग करें [WideWorldIm] का उपयोग करें। [बिगऑर्डर्स] ([ऑर्डर आईडी] [इंट] नॉट न्यूल, [कस्टमरआईडी] [इंट] नॉट न्यूल, [सेल्सपर्सनआईडी] [इंट] नॉट न्यूल, [पिक्डबायपर्सनआईडी] [इंट] न्यूल, [संपर्कपर्सनआईडी] [इंट] नॉट न्यूल, [ BackorderOrderID] [int] NULL, [OrderDate] [तारीख] न्यूल नहीं, [अपेक्षित डिलीवरी दिनांक] [तारीख] न्यूल नहीं, [CustomerPurchaseOrderNumber] [nvarchar] (20) NULL, [IsUndersupplyBackordered] [बिट] नॉट न्यूल, [सह मिनट] [नवरचर] (अधिकतम) नल, [वितरण निर्देश] [नवरचर] (अधिकतम) नल, [आंतरिक टिप्पणियां] [नवरचर] (अधिकतम) नल, [पिकिंग पूर्ण होने पर] [डेटाटाइम 2] (7) न्यूल, [लास्ट एडिटेडबी] [इंट] नहीं न्यूल, [अंतिम संपादित कब] [डेटाटाइम 2] (7) न्यूल नहीं, सीमित [पीके_सेल्स_बिगऑर्डर] प्राथमिक कुंजी क्लस्टर ([ऑर्डर आईडी] एएससी) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ONAGES =ALLOW_DUP_KEY =OFF, ONAGES =ALLOW_DUP_KEY =OFF, ONAGES) [USERDATA]) [USERDATA] TEXTIMAGE_ON [USERDATA] को चालू करें; DECLARE @Loops SMALLINT =0; DECLARE @IDIncrement INT =75000; जबकि @Loops <325 -- जोड़ी गई पंक्तियों की संख्या बढ़ाने या घटाने के लिए इसे समायोजित करेंBEGINSERT [बिक्री]। [आदेश दिनांक], [अपेक्षित वितरण दिनांक], [ग्राहक खरीद आदेश संख्या], [IsUndersupplyBackordered], [टिप्पणियां], [वितरण निर्देश], [आंतरिक टिप्पणियां], [पूरा होने पर चयन करना], [अंतिम संपादित, ग्राहक आईडी], [अंतिम आदेश आईडी] + चयन करें [अंतिम आदेश, ग्राहक आईडी] ], [सेल्सपर्सन आईडी], [पिकडबायपर्सन आईडी], [संपर्क व्यक्ति आईडी], [बैकऑर्डर ऑर्डर आईडी], [ऑर्डरडेट], [अपेक्षित डिलीवरी डेट], [ग्राहक खरीद ऑर्डर नंबर], [इस अंडरसप्लाई बैकऑर्डर], [टिप्पणियां], [डिलीवरी इंस्ट्रक्शन], [डिलीवरी इंस्ट्रक्शन], [डिलीवरी इंस्ट्रक्शन] [अंतिम संपादित द्वारा], [अंतिम संपादित कब] [बिक्री] से। [आदेश]; चौकी; SET @Loops =@Loops + 1; SET @IDIncrement =@IDIncrement + 75000; अंत गैर-अनुक्रमित सूचकांक बनाएं [NCI_BigOrders_OrderDate] ऑन [सेल्स]। [बिगऑर्डर्स] ([ऑर्डरडेट], कस्टमरआईडी); INSERT [सेल्स]। ( [ऑर्डर आईडी], [ग्राहक आईडी], [सेल्सपर्सन आईडी], [पिकेड बायपर्सन आईडी], [संपर्क व्यक्ति आईडी], [बैकऑर्डर ऑर्डर आईडी], [ऑर्डरडेट], [अपेक्षित डिलीवरी तिथि], [ग्राहक खरीद ऑर्डर संख्या], [डिलीवरी निर्देश], [डिलीवरी निर्देश], इंटरनल कमेंट्स], [पिकिंग कम्पलीटेडव्हेन], [लास्ट एडिटेडबी], [लास्ट एडिटेडव्हेन]) सेलेक्ट [ऑर्डर आईडी] + 25000000, [ग्राहक आईडी], [सेल्सपर्सन आईडी], [पिकडबायपर्सन आईडी], [कॉन्टैक्टपर्सनआईडी], [बैकऑर्डर ऑर्डर आईडी], '2016-06-01', [अपेक्षित डिलीवरी तिथि], [ग्राहक खरीद आदेश संख्या], [इस अंडरसप्लाई बैकऑर्डर किया गया], [टिप्पणियां], [वितरण निर्देश], [आंतरिक टिप्पणियां], [पिकिंग पूर्ण होने पर], [अंतिम संपादित द्वारा], [अंतिम संपादित कब] [बिक्री] से; -1); अद्यतन आँकड़े [बिक्री]। [बिगऑर्डर] [NCI_BigOrders_OrderDate]; INSERT [बिक्री] जाओ। [बिगऑर्डर] ( [ऑर्डर आईडी], [ग्राहक आईडी], [विक्रेता PersonID], [PickedByPersonID], [ContactPersonID], [बैकऑर्डर ऑर्डर आईडी], [ऑर्डरडेट], [अपेक्षित डिलीवरी दिनांक], [ग्राहक खरीद ऑर्डर संख्या], [IsUndersupplyBackordered], [टिप्पणियां], [कम्प्लीमेंट एडिटिंग], [इंटरनल कॉममेंट्स, , [अंतिम संपादित कब]) चुनें [आदेश आईडी] + 25100000, [ग्राहक आईडी], [विक्रेता व्यक्ति आईडी], [चुना हुआ व्यक्ति आईडी], [संपर्क व्यक्ति आईडी], [बैकऑर्डर आईडी], '2016-06-02', [अपेक्षित वितरण तिथि], [ग्राहक खरीद आदेश] ], [टिप्पणियां], [वितरण निर्देश], [आंतरिक टिप्पणियां], [पिकिंग पूर्ण होने पर], [अंतिम संपादित द्वारा], [अंतिम संपादित कब] [बिक्री] से। [आदेश]; अद्यतन आंकड़े [बिक्री] पर जाएं। [बिक्री]। ], [डिलीवरी निर्देश], [आंतरिक टिप्पणियां], [पिकिंग पूर्ण होने पर], [अंतिम संपादित द्वारा], [अंतिम संपादित डब्ल्यू मुर्गी]) चुनें [ऑर्डर आईडी] + 25200000, [ग्राहक आईडी], [विक्रेता व्यक्ति आईडी], [चुना हुआ व्यक्ति आईडी], [संपर्क व्यक्ति आईडी], [बैकऑर्डर आईडी], ‘2016-06-03’, [अपेक्षित डिलीवरी तिथि], [ग्राहक खरीद आदेश संख्या], [आदेश दिया गया [टिप्पणियां], [डिलीवरी निर्देश], [आंतरिक टिप्पणियां], [पिकिंग पूर्ण होने पर], [अंतिम संपादित द्वारा], [अंतिम संपादित कब] [बिक्री] से। [आदेश]; अद्यतन आंकड़े [बिक्री] पर जाएं। [बिग ऑर्डर] [एनसीआई_बिगऑर्डर_ऑर्डरडेट [बिक्री जाओ]; ]। [डिलीवरी निर्देश], [आंतरिक टिप्पणियां], [पिकिंग पूर्ण होने पर], [अंतिम संपादित द्वारा], [अंतिम संपादित कब]) चयन करें [ऑर्डर आईडी] + 25300000, [ग्राहक आईडी], [विक्रेता व्यक्ति आईडी], [पिकडबायपर्सन आईडी], [संपर्क व्यक्ति आईडी], [2016-ऑर्डर आईडी] 06-04', [अपेक्षित डिलीवरी की तारीख], [ग्राहक खरीद आदेश संख्या], [इस अंडरसप्लाई बैकऑर्डर किया गया], [टिप्पणियां], [डिलीवरी निर्देश], [इंटर्नलको एममेंट्स], [पिकिंग कम्पलीटेडव्हेन], [लास्ट एडिटेडबी], [लास्ट एडिटेडव्हेन] फ्रॉम [सेल्स]। [ऑर्डर्स]; अपडेट स्टैटिस्टिक्स [सेल्स] पर जाएं। 

ठीक है, तो हमारा डेटा पूरी तरह से लोड हो गया है। यदि हम आँकड़ों की फिर से जाँच करते हैं, और अतिरिक्त जानकारी प्रदर्शित करने के लिए ट्रेस फ़्लैग 2388 का उपयोग करते हैं, तो हम देखते हैं कि आँकड़ा फिर से आरोही के रूप में चिह्नित है:

DBCC TRACEON (2388);GO DBCC SHOW_STATISTICS ('Sales.BigOrders',[NCI_BigOrders_OrderDate]);


NCI OrderDate आँकड़ा TF 2389 और संगतता मोड 130 के साथ ASC के रूप में चिह्नित

ठीक है, तो चलिए फिर से 5 जून के बारे में पूछते हैं:

ग्राहक आईडी, ऑर्डर आईडी, विक्रेता व्यक्ति आईडी [बिक्री] से चुनें।[बिगऑर्डर]जहां [ऑर्डरडेट] ='2016-06-05';


नए CE के साथ योजना बनाएं, हिस्टोग्राम में जो है उससे आगे कोई पंक्ति नहीं है
उन्हें>

हमारा अनुमान 4,922 है। हमारे पहले टेस्ट में बिल्कुल वैसा नहीं था, लेकिन निश्चित रूप से नहीं 1.  अब हम 5 जून के लिए कुछ पंक्तियां जोड़ेंगे और फिर से पूछताछ करेंगे:

इन्सर्ट [सेल्स]। ], [टिप्पणियां], [डिलीवरी निर्देश], [आंतरिक टिप्पणियां], [पिकिंग पूर्ण होने पर], [अंतिम संपादित द्वारा], [अंतिम संपादित कब]) चुनें [ऑर्डर आईडी] + 25400000, [ग्राहक आईडी], [विक्रेता व्यक्ति आईडी], [चुना हुआ बायपर्सन आईडी], [संपर्क व्यक्ति आईडी] बैकऑर्डर ऑर्डर आईडी], '2016-06-05', [अपेक्षित डिलीवरी की तारीख], [ग्राहक खरीद ऑर्डर संख्या], [इस अंडरसप्लाई बैकऑर्डर किया गया है], [टिप्पणियां], [डिलीवरी निर्देश], [आंतरिक टिप्पणियां], [चुनना पूर्ण होने पर], [अंतिम संपादित बिक्री से], [अंतिम संपादित किया गया है] .[ऑर्डर];GO SELECT CustomerID, OrderID, SalespersonIDFROM [Sales].[BigOrders]WHERE [OrderDate] ='2016-06-05';


नए CE के साथ योजना बनाएं, 70K+ पंक्तियों के साथ हिस्टोग्राम में क्या है

अनुमान वही है। तो अब, अगर हम ट्रेस फ़्लैग 2389 को बंद कर दें तो क्या होगा?

DBCC TRACEOFF (2389, -1);GO DBCC FREEPROCCACHE;GO SELECT CustomerID, OrderID, SalespersonIDFROM [Sales]।[BigOrders]Where [OrderDate] ='2016-06-05';


नए CE के साथ योजना लेकिन TF 2389 सक्षम नहीं है, 70K+ के साथ हिस्टोग्राम में जो है उससे आगे की पंक्तियाँ

अनुमान थोड़ा बदल कर 4,930 हो गया, लेकिन यह बदल गया। यह मुझे बताता है कि ट्रेस फ्लैग 2389 का अनुमान पर कुछ प्रभाव पड़ता है, लेकिन कितना अज्ञात है।

परीक्षा - भाग III

मैंने एक अंतिम परीक्षण चलाया, जहां मैंने डेटाबेस को पुनर्स्थापित किया, संगतता मोड को 130 पर सेट किया, सभी डेटा को फिर से लोड किया, आंकड़ों को कई बार अपडेट किया, लेकिन ट्रेस फ्लैग 2389 को सक्षम नहीं किया। कोड का उपयोग करने के अलावा, भाग II जैसा ही है। 2389 को सक्षम करने के लिए DBCC TRACEON।  जब मैंने डेटा जोड़ने से पहले और बाद में 5 जून के लिए पूछताछ की, तो पंक्तियों की अनुमानित संख्या 4,920 थी।

इसका क्या अर्थ है?

संक्षेप में, संगतता मोड 110 या उससे नीचे का उपयोग करते समय, ट्रेस फ़्लैग 2389 हमेशा की तरह काम करता है। लेकिन संगतता मोड 120 या उच्चतर का उपयोग करते समय, और इस प्रकार नए CE, अनुमान नहीं . हैं पुराने सीई की तुलना में समान, और इस विशिष्ट मामले में, ट्रेस ध्वज का उपयोग करना या नहीं करना अलग नहीं है।

तो आपको क्या करना चाहिए? परीक्षण, हमेशा की तरह। मुझे MSDN में कुछ भी प्रलेखित नहीं मिला है जो बताता है कि ट्रेस फ़्लैग 2389 संगतता मोड 120 और उच्चतर के साथ समर्थित नहीं है, और न ही मुझे ऐसा कुछ भी मिला है जो व्यवहार में बदलाव का दस्तावेज़ देता है। मुझे यह बहुत दिलचस्प लगता है कि नए सीई के साथ अनुमान अलग हैं (इस मामले में बहुत कम)। यह संभावित रूप से एक मुद्दा हो सकता है, लेकिन जब अनुमानों की बात आती है तो खेल में कई कारक होते हैं, और यह एक बहुत ही सरल क्वेरी थी (एक टेबल, एक भविष्यवाणी)। इस मामले में, अनुमान बहुत दूर है (5 जून की तारीख के लिए 22,595 पंक्तियों की तुलना में 4920 पंक्तियाँ)।

यदि मैं किसी तिथि के लिए क्वेरी को फिर से चलाता हूं जिसमें पंक्तियों की संख्या समान है जो है हिस्टोग्राम के भीतर, मुझे एक समान योजना मिलती है, लेकिन यह समानांतर में चलती है:

ग्राहक आईडी, ऑर्डर आईडी, विक्रेता व्यक्ति आईडी [बिक्री] से चुनें। [बिग ऑर्डर] जहां [ऑर्डरडेट] ='2016-06-02';


उस क्वेरी के लिए योजना बनाएं जिसमें हिस्टोग्राम के भीतर दिनांक का उपयोग किया गया हो (नया) सीई, नो टीएफ)

अनुमान भी अधिक सटीक (68,318) है। इस मामले में योजना महत्वपूर्ण रूप से नहीं बदलती है, लेकिन लागत स्पष्ट रूप से अधिक है। किसी बिंदु पर, वापस आने वाली पंक्तियों की संख्या के आधार पर, यह एक टेबल स्कैन की ओर इशारा कर सकता है।

इस समय सबसे अच्छा मार्गदर्शन यदि आप 2014 या उच्चतर और संगतता मोड 120 या उच्चतर चला रहे हैं, और आपके पास आरोही आँकड़ों में अग्रणी कॉलम हैं, तो परीक्षण करना है। यदि आप पाते हैं कि नया कार्डिनैलिटी अनुमानक पुराने सीई के रूप में एक अनुमान के रूप में अच्छा प्रदान नहीं करता है, तो मैं एक कनेक्ट आइटम दाखिल करने की अनुशंसा करता हूं ताकि उत्पाद टीम को इसके बारे में पता चल सके। हमेशा एकबारगी और अद्वितीय मामले होते हैं, लेकिन यदि कई ग्राहक (पढ़ें:आप) लगातार एक ही व्यवहार पाते हैं - और यह आदर्श नहीं है - तो विकास टीम को इसके बारे में बताना महत्वपूर्ण है।

2014 या 2016 में अपग्रेड करते समय विचार करने के लिए यह एक और महत्वपूर्ण वस्तु है - और नहीं . के लिए एक अनुस्मारक अपने परीक्षण की उपेक्षा करें (और ओह वैसे, 2016 के साथ क्वेरी स्टोर यहां बेहद उपयोगी होगा)। इसे प्राप्त करें दोस्तों।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. शुरुआती के लिए SQL INSERT

  2. बाहरी सेवाओं के साथ लॉग इन करना

  3. प्लग करने योग्य डेटाबेस का नाम बदलना

  4. SQL तालिका बनाएँ… चयन कथन के रूप में

  5. डेल्फी को Salesforce.com से जोड़ना

© कॉपीराइट http://hi.sqldat.com सर्वाधिकार सुरक्षित