मैं 2008 R1 SP3 10.00.5512 पर रीप्रो करने में सक्षम था लेकिन नवीनतम सीयू (14) को स्थापित करने ने इसे ठीक कर दिया।
हस्तक्षेप करने वाले संस्करणों में तय की गई बग्स की समीक्षा करते हुए ऐसा लगता है कि आपको एक बिल्ड में अपग्रेड करने की आवश्यकता है जिसमें निम्नलिखित फिक्स शामिल हैं।
जब आप किसी क्वेरी को चलाते हैं जिसमें SQL Server 2008 में या SQL Server 2012 में एक खंड में कई निरंतर मान होते हैं, तो पहुँच उल्लंघन
जैसा कि आप 2008 R2 पर हैं, आपको SP1 के लिए कम से कम CU 9 या SP2 के लिए CU 5 की आवश्यकता होगी।
लक्षणों का वर्णन कुछ हद तक संक्षिप्त है लेकिन बेमेल डेटाटाइप्स का उल्लेख करता है
जब आप Microsoft SQL Server 2008, Microsoft SQL Server 2012 या Microsoft SQL Server 2008 R2 में एक खंड में कई निरंतर मान वाले क्वेरी चलाते हैं, तो एक एक्सेस उल्लंघन हो सकता है।
नोट: होने वाली समस्या के लिए, IN खंड में स्थिरांक स्तंभ डेटा प्रकार के साथ बिल्कुल मेल नहीं खा सकते हैं।
यह "कई" को परिभाषित नहीं करता है। परीक्षण से मुझे संदेह था कि इसका मतलब "20 या अधिक" हो सकता है क्योंकि यह कार्डिनलिटी का आकलन करने के दो अलग-अलग तरीकों के बीच कट ऑफ पॉइंट लगता है।
यह दुर्घटना कुछ तरीकों से हो रही थी, CScaOp_In::FCalcSelectivity()
जैसे नामों के साथ LoadHistogramFromXVariantArray()
और CInMemHistogram::FJoin() -> WalkHistograms()
।
19 या इससे कम सूची वाले आइटमों के लिए ये तरीके बिल्कुल भी नहीं कहे जा रहे थे। एक समान एसक्यूएल Sever 2000 बग भी महत्वपूर्ण के रूप में बिंदु बंद इस कटौती का उल्लेख है।
0 और 1047 के बीच मूल्यों के साथ यादृच्छिक परीक्षण डेटा की 100,000 पंक्तियों के साथ एक परीक्षण तालिका को पॉप करना और एक हिस्टोग्राम निम्नानुसार शुरू करना
+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
| 0 | 0 | 104 | 0 | 1 |
| 8 | 672 | 118 | 7 | 96 |
| 13 | 350 | 118 | 4 | 87.5 |
| 18 | 395 | 107 | 4 | 98.75 |
| 23 | 384 | 86 | 4 | 96 |
| 28 | 371 | 85 | 4 | 92.75 |
+--------------+------------+---------+---------------------+----------------+
पूछताछ
SELECT * FROM dbo.[TestTable]
where mpnr in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19)
option (maxdop 1)
1856 की अनुमानित पंक्तियों को दर्शाता है।
यह वही है जो 19 समानता के लिए अनुमानित पंक्तियों को व्यक्तिगत रूप से अनुमानित करता है और उन्हें एक साथ जोड़कर उम्मीद की जाती है।
+-------+----------------+-------+
| 1-7 | AVG_RANGE_ROWS | 96 |
| 8 | EQ_ROWS | 118 |
| 9-12 | AVG_RANGE_ROWS | 87.5 |
| 13 | EQ_ROWS | 118 |
| 14-17 | AVG_RANGE_ROWS | 98.75 |
| 18 | EQ_ROWS | 107 |
| 19 | AVG_RANGE_ROWS | 96 |
+-------+----------------+-------+
7*96 + 118 + 4*87.5 + 118 + 4*98.75 + 107 + 1*96 = 1856
20
सूची में जोड़े जाने के बाद फॉर्मूला अब काम नहीं करता (अनुमानित पंक्तियों के 1902.75
बजाय कुल 1952
जोड़ एक 96
और उत्पन्न होगा)।
BETWEEN
कार्डिनैलिटी अनुमानों की गणना करने की एक और विधि का उपयोग करना प्रतीत होता है।
where mpnr BETWEEN 1 AND 20
केवल 1829.6 पंक्तियों का अनुमान है। मुझे नहीं पता कि कैसे दिखाया गया हिस्टोग्राम से व्युत्पन्न है।