การสนับสนุน Parallel Scalar UDF เป็นการร้องขอคุณสมบัติที่เหมาะสมหรือไม่?


10

มีการบันทึกไว้ค่อนข้างดีว่าสเกลาร์ของ UDF เป็นแผนอนุกรมโดยรวม

ฟังก์ชั่นที่ทำงานในแบบคู่ขนาน

เมื่อมีจำนวนแถวเข้ามาในจุดที่ต้องคำนวณ UDF ทำไมเครื่องยนต์ไม่สามารถกระจายไปยังโปรเซสเซอร์ได้ หากไม่มีสถานะใน UDF คำสั่งนั้นไม่ควรสำคัญ

มีการเรียกร้องเกี่ยวกับ UDF ที่เป็นกล่องดำจะต้องใช้เคอร์เซอร์ ฉันเห็นว่าเคอร์เซอร์ผู้ใช้ไม่สามารถทำให้ขนานภายใน SP สำหรับกรณีที่บางสถานะถูกเก็บรักษาไว้ระหว่างการทำซ้ำ แต่ดูเหมือนว่าควรจะเป็นแบบขนาน

คะแนนพิเศษสำหรับการอธิบายว่าทำไมเครื่องยนต์บังคับให้แผนทั้งหมดเป็นอนุกรมแทนที่จะเป็นเพียงขั้นตอนการคำนวณ UDF

การสนับสนุน UDF แบบขนานเป็นคุณสมบัติที่เหมาะสมในการร้องขอหรือไม่


1
ปฏิกิริยาที่เหมาะสมน่าจะเป็น s ที่ระบุไว้ในคำตอบที่ได้รับการยอมรับในการเชื่อมโยงของคุณจะเขียนใด ๆเกลาผู้ใช้ฟังก์ชั่นที่กำหนดเป็นคอลัมน์เดียวฟังก์ชั่นแบบอินไลน์ตารางมูลค่า สิ่งเหล่านี้จะขยายในลักษณะเดียวกับมุมมองและถูกปรับให้เหมาะสมที่สุด ในแง่นี้คำถามของคุณยังมีข้อดีอยู่หรือไม่?
Pieter Geerkens

1
ใช่ประสบความสำเร็จด้วยการแก้ปัญหาของ TVF ฉันถามเพราะมันผิดที่จะหลีกเลี่ยงการใช้โครงสร้างที่เป็นธรรมชาติ และดูเหมือนว่าจะเป็นไปไม่ได้ที่จะคาดหวังว่านักพัฒนา SQL ใหม่จะเรียนรู้ UDF ภายใน
crokusek

ชี้แจงความคิดเห็น ประสบความสำเร็จกับ ITVF แต่ไม่ใช่ TVF หลายงบ
crokusek

คำตอบ:


17

เป็นเอกสารที่ค่อนข้างดีว่า UDF บังคับให้ใช้แผนอนุกรมโดยรวม

ฉันไม่แน่ใจว่ามันเป็นเอกสารที่ดี

  • ฟังก์ชัน T-SQL แบบสเกลาร์จะป้องกันการขนานในทุกที่ในแผน
  • ฟังก์ชัน scalar CLR สามารถดำเนินการแบบขนานตราบใดที่ไม่สามารถเข้าถึงฐานข้อมูล
  • ฟังก์ชั่น T-SQL ที่มีมูลค่าเป็นตารางหลายงบบังคับให้โซนอนุกรมในแผนที่อาจใช้การขนานในที่อื่น
  • ฟังก์ชัน T-SQL ที่มีค่าเป็นตารางแบบอินไลน์ถูกขยายออกเหมือนมุมมองดังนั้นจึงไม่มีผลกระทบโดยตรง

ดูบังคับแผนดำเนินการคู่ขนานและ / หรือเครกอิสระของการนำเสนอการดำเนินการคู่ขนาน

มีการอ้างสิทธิ์เกี่ยวกับ UDF ที่เป็นกล่องดำจะต้องใช้เคอร์เซอร์

การอ้างสิทธิ์เหล่านี้ไม่ถูกต้อง

คะแนนพิเศษสำหรับการอธิบายว่าทำไมเครื่องยนต์บังคับให้แผนทั้งหมดเป็นอนุกรมแทนที่จะเป็นเพียงขั้นตอนการคำนวณ UDF

ความเข้าใจของฉันคือข้อ จำกัด ในปัจจุบันเป็นผลมาจากรายละเอียดการใช้งานบางอย่าง ไม่มีเหตุผลพื้นฐานที่ฟังก์ชั่นไม่สามารถดำเนินการได้โดยใช้การขนาน

โดยเฉพาะอย่างยิ่งฟังก์ชั่นสเกลาร์ T-SQL จะดำเนินการภายในบริบท T-SQL ที่แยกต่างหากซึ่งทำให้การดำเนินงานการประสานงานและการปิดที่ถูกต้องมีความซับซ้อน (โดยเฉพาะในกรณีที่มีข้อผิดพลาด) อย่างมาก

ตัวแปรตารางจะสนับสนุนการอ่านแบบขนาน (แต่ไม่ใช่การเขียน) โดยทั่วไป แต่ตัวแปรตารางที่แสดงโดยฟังก์ชันที่มีค่าของตารางไม่สามารถรองรับการอ่านแบบขนานได้สำหรับเหตุผลเฉพาะของการใช้งาน คุณจะต้องการใครสักคนที่มีสิทธิ์เข้าถึงซอร์สโค้ด (และอิสระในการแบ่งปันรายละเอียด) เพื่อให้คำตอบที่เชื่อถือได้ฉันกลัว

การสนับสนุน UDF แบบขนานเป็นคุณสมบัติที่เหมาะสมในการร้องขอหรือไม่

แน่นอนถ้าคุณสามารถทำคดีที่แข็งแกร่งพอ ความรู้สึกของตัวเองของฉันอยู่ที่งานที่เกี่ยวข้องจะเป็นที่กว้างขวางเพื่อให้ข้อเสนอของคุณจะต้องตอบสนองมากบาร์สูง ตัวอย่างเช่นคำขอที่เกี่ยวข้อง (และง่ายกว่า) ที่เกี่ยวข้องเพื่อให้ฟังก์ชั่นสเกลาร์แบบอินไลน์ได้รับการสนับสนุนที่ดี แต่ได้เลิกใช้มาหลายปีแล้ว


คุณอาจต้องการอ่านกระดาษ Microsoft:

... ซึ่งสรุปแนวทางที่ Microsoft มองหาเพื่อแก้ไขปัญหาประสิทธิภาพการทำงานของสเกลาร์ T-SQL ในรุ่นหลัง SQL Server 2017

เป้าหมายของ Froid คือเพื่อให้นักพัฒนาสามารถใช้ abstractions ของ UDF และขั้นตอนโดยไม่กระทบต่อประสิทธิภาพ Froid บรรลุเป้าหมายนี้โดยใช้เทคนิคนวนิยายเพื่อแปลงโปรแกรมที่จำเป็นโดยอัตโนมัติให้เป็นรูปแบบพีชคณิตเชิงสัมพันธ์ที่เทียบเท่ากันเมื่อใดก็ตามที่เป็นไปได้ Froid โมเดลบล็อกของโค้ดที่จำเป็นเป็นนิพจน์เชิงสัมพันธ์และรวมเข้าด้วยกันเป็นนิพจน์เดียวโดยใช้ตัวดำเนินการ Apply ซึ่งจะทำให้เครื่องมือเพิ่มประสิทธิภาพการสืบค้นสามารถเลือกแผนการสอบถามแบบขนานที่มีประสิทธิภาพ

(เน้นที่เหมือง)


ฟังก์ชั่นแบบอินไลน์สเกลา T-SQL อยู่ในขณะนี้การดำเนินการใน SQL Server 2019


11

ดังที่เปาโลได้กล่าวไว้อย่างถูกต้องในคำตอบของเขาไม่มีเหตุผลพื้นฐานที่ทำให้ UDF สเกลาร์ไม่สามารถดำเนินการได้โดยใช้การขนาน อย่างไรก็ตามนอกเหนือจากความท้าทายในการติดตั้งแล้วยังมีอีกเหตุผลที่บังคับให้พวกเขาเป็นอนุกรม Froidกระดาษโดยอ้างว่าพอลจะช่วยให้ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้

ข้อความจากกระดาษ (ส่วน 2.3):

ปัจจุบัน SQL Server ไม่ได้ใช้การขนานภายในแบบสอบถามในแบบสอบถามที่เรียกใช้ UDF วิธีการสามารถออกแบบมาเพื่อลดข้อ จำกัด นี้ แต่พวกเขาแนะนำความท้าทายเพิ่มเติมเช่นการเลือกระดับความเท่าเทียมที่เหมาะสมสำหรับการเรียกใช้ UDF แต่ละครั้ง

ตัวอย่างเช่นพิจารณา UDF ที่เรียกใช้แบบสอบถาม SQL อื่น ๆ เช่นแบบสอบถามในรูปที่ 1 แต่ละแบบสอบถามดังกล่าวอาจใช้ตัวขนานและดังนั้นเครื่องมือเพิ่มประสิทธิภาพจึงไม่มีวิธีรู้วิธีแชร์เธรดข้ามพวกเขา UDF และตัดสินใจระดับของการขนานสำหรับแต่ละเคียวรีภายใน (ซึ่งอาจเปลี่ยนจากการเรียกใช้หนึ่งเป็นอีกอัน ด้วย UDF แบบซ้อนและแบบเรียกซ้ำปัญหานี้จะยิ่งยากต่อการจัดการ

วิธีการของ Froid ดังที่อธิบายไว้ในกระดาษไม่เพียง แต่จะส่งผลให้เกิดแผนคู่ขนานเท่านั้น แต่ยังเพิ่มประโยชน์อีกมากมายสำหรับการสืบค้นด้วย UDF ในสาระสำคัญมันจะขอให้คุณเรียกใช้ UDF แบบขนาน

อัปเดต:ตอนนี้ Froid พร้อมใช้งานเป็นคุณลักษณะของการแสดงตัวอย่าง SQL Server 2019 คุณลักษณะนี้เรียกว่า "Scalar UDF Inlining" รายละเอียดเพิ่มเติมได้ที่นี่: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/11/07/introducing-scalar-udf-inlining/

[การเปิดเผย: ฉันเป็นผู้เขียนร่วมของกระดาษ Froid]


ดีมาก! ถ้าฉันเข้าใจอย่างถูกต้องมันจะแปลง UDF ให้เป็น ITVF โดยอัตโนมัติ เราได้ทำสิ่งนี้มาสองสามครั้ง (w / ประกาศ / ถ้า / อื่น) และทำให้เป็นระเบียบดี เรายังมีการแก้ปัญหา "คอลัมน์"
crokusek

1
มันไม่ได้แปลง UDF ให้เป็น ITVF แต่สัญชาตญาณของคุณถูกต้อง การทำสิ่งนี้ด้วยตนเองที่ระดับคิวรี SQL นั้นยุ่งเหยิงจริงๆสำหรับ UDF ที่ซับซ้อน Froid ทำการเปลี่ยนแปลงนี้บนต้นไม้พีชคณิตเชิงสัมพันธ์ซึ่งหลีกเลี่ยงความยุ่งเหยิง :)
Karthik

@Karthik คุณสามารถดูที่dba.stackexchange.com/questions/202211/... ฉันอยากรู้ว่า Froid กำลังจะแสดงในกรณีที่อธิบายอย่างไร
Roman Pekar

@ Roman ฉันได้แสดงความคิดเห็นกับคำถามของคุณ
Karthik

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