अजीब एसक्यूएल सर्वर का उदाहरण संख्यात्मक करने के लिए कास्टिंग पर दुर्घटना


20

C # एंटिटी फ्रेमवर्क के साथ काम करते समय मैंने अपने SQL सर्वर इंस्टेंस का क्रैश देखा।

मैं इसे इस कथन पर नज़र रखने में सक्षम था:

SELECT * FROM dbo.[TestTable]
where mpnr in (1099059904,
1038139906,
1048119902,
1045119902,
1002109903,
1117109910,
1111149902,
1063149902,
1117159902,
1116109904,
1105079905,
1012079906,
1129129904,
1103059905,
1065059905,
1091059906,
1110149904,
1129149903,
1083029905,
1080139904,
1076109903,
1010019902,
1058019902,
1060019903,
1053019902,
1030089902,
1018149902,
1077149902,
1010109901,
1011109901,
1000119902,
1023049903,
1107119909,
1108119909,
1106119909)

तालिका इस तरह दिखती है:

CREATE TABLE dbo.[TestTable]([MPNR] [numeric](9, 0) NOT NULL)

हर बार जब मैं क्वेरी शुरू करता हूं तो दुर्घटना होती है। यदि मैं INक्लॉज़ के भीतर मानों की संख्या कम कर देता हूं , तो यह काम करता है। (यह निश्चित रूप से कोई पंक्तियाँ नहीं लौटाता है।)

मुझे पता है कि INखंड में मान 10-अंकीय संख्या हैं और स्तंभ में केवल 9-अंक हैं, लेकिन इससे पूरे SQL सर्वर आवृत्ति का क्रैश नहीं होना चाहिए।

मेरा SQL सर्वर का संस्करण Windows Server 2003 32-बिट पर 2008 R2 है।

क्या यह कोई ज्ञात त्रुटि है? SQL सर्वर के लिए एक पैच है?


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
पॉल व्हाइट GoFundMonica कहते

जवाबों:


20

मैं 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 पंक्तियों का अनुमान है। मुझे नहीं पता कि कैसे दिखाया गया हिस्टोग्राम से व्युत्पन्न है।

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