OPTION FAST ในคำสั่ง SELECT ทำอะไร?


29

ฉันได้ทำการขุดในสิ่งที่OPTION (FAST XXX)คำใบ้ในแบบสอบถามSELECTและฉันยังสับสนอยู่ อ้างอิงจาก MSDN:

ระบุว่าเคียวรีถูกปรับให้เหมาะสมสำหรับการดึง number_rows แรกอย่างรวดเร็ว นี่เป็นจำนวนเต็มที่ไม่ใช่ค่าลบ หลังจากที่ number_rows แรกถูกส่งคืนเคียวรีจะยังคงประมวลผลและสร้างชุดผลลัพธ์แบบเต็ม

สำหรับฉันที่ไม่สมเหตุสมผล แต่โดยทั่วไปแล้วการสืบค้นจะได้แถว XXX แรกเร็วมากจากนั้นส่วนที่เหลือที่ความเร็วปกติคืออะไร

แบบสอบถาม Microsoft Dynamics ที่ทำให้ฉันคิดในเรื่องนี้คือ:

select pjproj.project,pjproj.project_desc,pjproj.customer,pjproj.cpnyid
from pjproj WITH (NOLOCK)
where project like  '%'
order by project OPTION(FAST 500)

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

คำตอบ:


24

FAST Nจะบอก SQL Server Nเพื่อสร้างแผนปฏิบัติการที่มีได้อย่างรวดเร็วกลับจำนวนแถวกำหนดให้เป็น

โปรดทราบว่าการประมาณจะเป็นไปตามที่Nคุณบอกเซิร์ฟเวอร์ sql เพื่อดึงNแถวให้เร็วที่สุด

เช่นเรียกใช้แบบสอบถามด้านล่างด้วยfast 500:

-- total rows : 19972
 SELECT [BusinessEntityID]
      ,[TotalPurchaseYTD]
      ,[DateFirstPurchase]
      ,[BirthDate]
      ,[MaritalStatus]
      ,[YearlyIncome]
      ,[Gender]
      ,[TotalChildren]
      ,[NumberChildrenAtHome]
      ,[Education]
      ,[Occupation]
      ,[HomeOwnerFlag]
      ,[NumberCarsOwned]
  FROM [AdventureWorks2012].[Sales].[vPersonDemographics]
  order by BusinessEntityID
  option (fast 500)

Est เทียบกับแถวจริงด้วย option (fast 500)

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

Est เทียบกับแถวจริงที่ไม่มี option (fast 500)

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

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

อีกกรณีการใช้งานที่น่าสนใจคือในSSIS ที่ Rob Farleyอธิบายการใช้FAST Nเป็นตัวเร่งปฏิกิริยาเพื่อเร่งการดึงข้อมูล

โดยการเพิ่มคำใบ้นี้มันให้ความรู้สึกเหมือนไม้กายสิทธิ์ถูกโบกมือข้ามคิวรี่เพื่อให้มันทำงานได้เร็วขึ้นหลายเท่า

ดูคำตอบรีมัส Rusanu เช่นกัน


11

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

เพื่ออธิบายรายละเอียดเกี่ยวกับกรณีการใช้งาน: คุณอาจมีตารางขนาดใหญ่พอสมควรสองตัวที่คุณต้องการรวมเข้าด้วยกัน แต่คุณรู้ว่ามีชุดข้อมูลขนาดเล็กเพียงชุดเดียวที่คุณต้องใช้กับหนึ่งในนั้น ในกรณีนี้การใช้ FAST บนตารางที่มีขนาดใหญ่ขึ้นโดยไม่ต้องสร้างดัชนี / ค่าใช้จ่ายเพิ่มเติมสามารถช่วยแทนการวาง SQL SQL เพื่อสร้างตารางแฮชขนาดใหญ่ในพื้นหลัง


2

ฉันสะดุดกับคำถามเดียวกันเมื่อสองสามปีก่อนเมื่อตรวจสอบปัญหาด้านประสิทธิภาพใน Dynamics AX ตามคำอธิบายของ Microsoft ฉันสามารถเห็นแผนการดำเนินการที่แตกต่างกันซึ่งถูกกระตุ้นโดยคำใบ้และสิ่งนี้สอดคล้องกับคำตอบอื่น ๆ ที่ให้ไว้ที่นี่

ด้วยคำใบ้ SQL Server พยายามค้นหาแผนการดำเนินการที่อนุญาตให้มีการเรียงลำดับของการสตรีมของผลลัพธ์เนื่องจากพวกเขาออกจากลูปซ้อนกันเช่นแทนที่จะเป็นแผนการดำเนินการที่ต้องการอ่านระเบียนทั้งหมด (และอาจเรียงลำดับ) ก่อน กำลังส่งออก

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

ดังนั้นเพื่อตอบ OP: เหมือนคำแนะนำมากมายมันไม่จำเป็นต้องช่วยปรับปรุงการค้นหาอย่างที่ควรจะเป็น (เช่น ... ทดสอบทดสอบทดสอบ!)

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