बैच मोड विंडो कुल उपज अंकगणितीय अतिप्रवाह क्यों करता है?


11

निम्न क्वेरी SUMकिसी स्तंभ की तालिका के साथ एक विंडो प्रदर्शित करती है 1500 total rows, जिसमें से प्रत्येक का मान 0 या 1 है, और यह INTडेटा प्रकार को ओवरफ्लो करता है । ये क्यों हो रहा है?

SELECT a, p, s, v, m, n,
    SUM(CASE WHEN n IS NULL THEN 0 ELSE 1 END)
        OVER (PARTITION BY s, v, a ORDER BY p) AS lastNonNullPartition
FROM (
    SELECT a, p, s, v, m, n,
        RANK() OVER (PARTITION BY v, s, a, p ORDER BY m) AS rank
    FROM #t /* A columnstore table with 1,500 rows */
)  x
WHERE x.rank = 1
--Msg 8115, Level 16, State 2, Line 1521
--Arithmetic overflow error converting expression to data type int.

पूरी स्क्रिप्ट

पूरी तरह से निहित प्रजनन स्क्रिप्ट के लिए इस फ़ाइल को देखें।

क्वेरी योजना

यहां एक एनोटेट अनुमानित क्वेरी प्लान ( पेस्ट प्लान पर पूर्ण एक्सएमएल ) है।

यहाँ छवि विवरण दर्ज करें

इसी तरह के प्रश्न जो सफलतापूर्वक निष्पादित होते हैं

यदि निम्न में से कोई संशोधन किया जाता है, तो त्रुटि उत्पन्न नहीं होती है:

  • 8649समानांतरता के लिए लागत सीमा की परवाह किए बिना एक समानांतर योजना पसंद करने के लिए ट्रेस ध्वज का उपयोग करें
  • 9453बैच मोड को अक्षम करने के लिए ट्रेस ध्वज का उपयोग करें
  • का प्रयोग करें COUNTके बजाय एकत्रीकरण समारोह SUMसमारोह
  • WHERE x.rank = 1विधेय निकालें

उदाहरण के लिए, यह क्वेरी सफलतापूर्वक निष्पादित होती है:

SELECT a, p, s, v, m, n,
    SUM(CASE WHEN n IS NULL THEN 0 ELSE 1 END)
        OVER (PARTITION BY s, v, a ORDER BY p) AS lastNonNullPartition
FROM (
    SELECT a, p, s, v, m, n,
        RANK() OVER (PARTITION BY v, s, a, p ORDER BY m) AS rank
    FROM #t /* A columnstore table with 1,500 rows */
)  x
WHERE x.rank = 1
OPTION (QUERYTRACEON 9453/* Disable batch mode */) 

जवाबों:


6

एकाधिक टिप्पणीकारों ने इस मुद्दे को पुन: पेश करने में सक्षम किया है। हमने शुरू में सोचा था कि SQL Server 2017 CU10 ने इस मुद्दे को हल कर दिया है, लेकिन फिर पाया कि त्रुटि SQL सर्वर के सभी संस्करणों में पुन: पेश की जा सकती है, जिसमें हमने CU10 भी शामिल है। हालांकि, कुछ टिप्पणीकारों ने मौका का एक तत्व देखा जहां एक ही स्क्रिप्ट ने हमेशा त्रुटि को ट्रिगर नहीं किया।

क्योंकि ऐसा कोई तार्किक तरीका नहीं है कि गैर-ऋणात्मक संख्याओं के सेट पर एक योग की गणना, जिसकी अधिकतम संभव राशि 1,500 है, 32 बिट पूर्णांक को ओवरफ्लो कर सकता है, हमारा मानना ​​है कि यह बैच मोड विंडो एग्रीगेट ऑपरेटर में एक बग है। SQL सर्वर 2016 में एक नया ऑपरेटर होने के नाते, यह मान लेना उचित है कि अभी भी कुछ किनारे मामले लोहे के हो सकते हैं।

यहाँ बग रिपोर्ट है जिसे हमने Microsoft के साथ दायर किया है।

प्रतिक्रिया थी:

यह SQL Server 2019 CTP 2.1 में तय किया गया है और यह जल्द ही Azure SQL डेटाबेस में भी तय हो जाएगा।

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