การเพิ่มประสิทธิภาพ: การย้ายการประกาศตัวแปรไปยังด้านบนของกระบวนการของคุณ


15

ในขณะที่ทำงานเกี่ยวกับการเพิ่มประสิทธิภาพของโพรซีเดอร์ที่เก็บไว้บางอย่างฉันก็นั่งลงกับ DBA และผ่านขั้นตอนที่เก็บไว้บางอย่างที่มีการบล็อกสูงและ / หรือกิจกรรมการอ่าน / เขียนสูง

สิ่งหนึ่งที่ DBA กล่าวถึงคือฉันควรประกาศตัวแปรทั้งหมด (โดยเฉพาะอย่างยิ่งตัวแปรTABLEที่ด้านบนสุดของโพรซีเดอร์ที่เก็บไว้เพื่อหลีกเลี่ยงการคอมไพล์ซ้ำ

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

การย้ายการประกาศตัวแปรทั้งหมดไปยังด้านบนของโพรซีเดอร์ที่เก็บไว้ของคุณจะลดการคอมไพล์ใหม่หรือไม่?

คำตอบ:


18

เลขที่

สิ่งนี้เคยเป็นจริงเมื่อนานมาแล้ว (และไม่เป็นอย่างน้อยตั้งแต่ SQL Server 2000) หรือไม่เคยเป็นจริงและ DBA ของคุณเพิ่งสับสนคำแนะนำของเขากับสิ่งต่อไปนี้ :

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

คุณสามารถหาคำอธิบายเพิ่มเติมเกี่ยวกับเหตุผลที่อยู่เบื้องหลังคำแนะนำนี้ได้ในหน้านี้

ถ้าเราดูที่Microsoft KBนี้เราจะเห็นว่าสาเหตุของการคอมไพล์การจัดเก็บอาจเป็นหนึ่งในสาเหตุดังต่อไปนี้ (SQL Server 2005+):

  1. เปลี่ยนสคีมาแล้ว
  2. สถิติเปลี่ยนไป
  3. คอมไพล์ DNR
  4. เปลี่ยนการตั้งค่าตัวเลือก
  5. เปลี่ยนตารางชั่วคราวแล้ว
  6. เปลี่ยนชุดรีโมตระยะไกลแล้ว
  7. สำหรับการเรียกดู perms มีการเปลี่ยนแปลง
  8. สภาพแวดล้อมการแจ้งเตือนการเปลี่ยนแปลงมีการเปลี่ยนแปลง
  9. มุมมอง MPI เปลี่ยนไป
  10. ตัวเลือกเคอร์เซอร์เปลี่ยนไป
  11. ด้วยตัวเลือก recompile

ประกาศตัวแปร - แม้ตัวแปรตาราง (เช่น@table_variable) - ไม่สามารถเรียกใด ๆ ของเหตุการณ์เหล่านี้เห็นได้ชัดเพราะการประกาศตัวแปรไม่นับเป็น DDL ตัวแปร (แม้แต่ตัวแปรตาราง) เป็นวัตถุชั่วคราวที่ใช้สำหรับการเขียนโปรแกรม T-SQL ของคุณโดยเฉพาะ นั่นเป็นเหตุผลที่ตัวแปรตารางได้รับสถิติไม่มีและไม่ผูกพันตามการทำธุรกรรม การประกาศตัวแปร (ตารางหรือไม่) ไม่สามารถทริกเกอร์การคอมไพล์ซ้ำได้

การสร้างตาราง temp (เช่น#temp_table) หรือดัชนีอย่างไรก็ตามเป็น DDL ที่มีผลต่อการกำหนดทางกายภาพของฐานข้อมูล ตารางชั่วคราวและดัชนีเป็นวัตถุ "ของจริง" ที่มีสถิติและการควบคุมการทำธุรกรรมดังนั้นการสร้างพวกเขาสามารถเริ่มต้นเหตุการณ์ใด ๆ 1, 2 หรือ 5 ในรายการด้านบนและทำให้ทริกเกอร์ proc recompile


3

ไม่ควรสร้างความแตกต่างหรือลดการล็อกคอมไพล์หรือทำให้ recompilations น้อยลงเพื่อประกาศตัวแปรลงครึ่งหนึ่งของสแต็กหรือที่ด้านบน ฉันบังเอิญทำสิ่งนี้ที่ด้านบนสุดเพื่อให้สามารถอ่านได้บ่อยกว่าไม่

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

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

โพสต์ตัวอย่างก่อน / หลังและเราจะดูว่า DBA กำลังขับรถอยู่ที่นี่

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