เหตุใดหน้าต่างโหมดแบตช์จึงรวมการคำนวณทางคณิตศาสตร์มากเกินไป


11

แบบสอบถามต่อไปนี้ดำเนินการแบบหน้าต่างSUMเหนือตาราง columnstore ด้วย1500 total rowsซึ่งแต่ละอันมีค่า 0 หรือ 1 และมัน overflows 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.

สคริปต์เต็ม

ดูไฟล์นี้สำหรับสคริปต์การทำสำเนาที่มีอยู่อย่างสมบูรณ์

แผนแบบสอบถาม

นี่คือแผนการสืบค้นที่ประเมินหมายเหตุแบบย่อ ( XML แบบเต็มบนวางแผน )

ป้อนคำอธิบายรูปภาพที่นี่

แบบสอบถามที่คล้ายกันซึ่งดำเนินการสำเร็จ

หากทำการแก้ไขใด ๆ ต่อไปนี้ข้อผิดพลาดจะไม่เกิดขึ้น:

  • ใช้การตั้งค่าสถานะการสืบค้นกลับ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 Server ทุกรุ่นที่เราลองใช้รวมถึง CU10 อย่างไรก็ตามผู้แสดงความคิดเห็นบางคนสังเกตเห็นองค์ประกอบของโอกาสที่สคริปต์เดียวกันไม่ได้ทำให้เกิดข้อผิดพลาดเสมอไป

เนื่องจากไม่มีวิธีตรรกะในการคำนวณผลรวมในชุดของตัวเลขที่ไม่เป็นลบซึ่งผลรวมสูงสุดที่เป็นไปได้คือ 1,500 สามารถล้นได้เป็นจำนวนเต็ม 32 บิตเราเชื่อว่านี่เป็นข้อผิดพลาดในตัวดำเนินการรวมหน้าต่างโหมดแบทช์ การเป็นผู้ดำเนินการใหม่ใน SQL Server 2016 จึงมีเหตุผลที่จะสมมติว่าอาจยังมีบางกรณีที่ต้องทำการแก้ไข

นี่คือรายงานข้อผิดพลาดที่เรายื่นกับ Microsoft

คำตอบคือ:

สิ่งนี้ได้รับการแก้ไขใน SQL Server 2019 CTP 2.1 และจะได้รับการแก้ไขในไม่ช้าในฐานข้อมูล Azure SQL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.