คำแนะนำในการเพิ่มประสิทธิภาพการค้นหา SQL Server 2005/8


13

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

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

อะไรสิ่งที่ง่ายที่ฉันควรจะบอกทีมงานที่จะลองและมักจะใช้หรือหลีกเลี่ยง? ฉันกำลังมองหาสิ่งที่ (a) อาจสร้างความแตกต่างที่สมเหตุสมผลและ (b) ตรงไปตรงมา 1 - 2 บรรทัดเพื่อระบุ

คำตอบ:


13

ปรับแต่งแบบสอบถาม 101

ไม่มี bullet เงินวิเศษในการปรับแต่งการค้นหาแม้ว่าฉันจะให้คำแนะนำและเคล็ดลับ สิ่งแรกที่ต้องทำคือการเข้าใจสิ่งที่เกิดขึ้นจริงเบื้องหลัง รับหนังสือภายในที่ดีเช่นหนังสือคู่มือคุรุเล่มที่สาม

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

ข้อความค้นหาธุรกรรม

ในกรณีส่วนใหญ่แบบสอบถามธุรกรรมที่มีประสิทธิภาพต่ำเป็นหนึ่งในบางสิ่ง:

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

  • ข้อความค้นหาไม่สามารถใช้ดัชนี หากคุณมีเงื่อนไข OR ในตำแหน่ง clause ให้รวมกับค่าที่คำนวณได้หรือรายการอื่น ๆ ในแบบสอบถามที่ไม่สามารถขายสินค้าได้คุณอาจต้องเขียนแบบสอบถามอีกครั้ง โดยสรุปsargsเป็นเพรดิเคตแบบสอบถามที่สามารถใช้ดัชนีเพื่อกำจัดแถว ตรรกะ AND, ความเสมอภาคและความไม่เท่าเทียมกัน (>,> =, <, <= และ! =) ล้วน แต่มีความสามารถ หรือเป็นแบบดั้งเดิมไม่สามารถ sarg ได้ อย่างไรก็ตามคุณสามารถแปล OR ให้เป็นเพรดิเคตที่มีความสามารถได้ด้วยการแปลงความรู้สึกจาก OR เป็นแบบสร้างไม่ได้ (foo and bar)

  • ภาคแสดงที่ไม่มีประสิทธิภาพ ตัวอย่างเช่นหากคุณมีการwhere inอ้างอิงแบบสอบถามย่อยที่ซ้อนกันดูว่ามันสามารถเขียนใหม่เป็นwhere existsหรือเข้าร่วม ซึ่งอาจส่งผลให้แผนการสืบค้นมีประสิทธิภาพมากขึ้นและนี่คือมาตรฐานการเขียนใหม่ที่คุณสามารถลองใช้ได้ อีกครั้งหนังสือคู่มือของคุรุและคนอื่น ๆ ในเรื่องนี้เป็นจุดเริ่มต้นที่ดี

แบบสอบถามแบบกลุ่ม

แบบสอบถามแบบกลุ่มมีความซับซ้อนมากขึ้นและมีปัญหาการปรับแต่งที่แตกต่าง เคล็ดลับคือ:

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

  • ตารางชั่วคราว คุณอาจพบว่าเป็นการดีกว่าที่จะแบ่งแบบสอบถามออกเป็นหลายแบบสอบถามเติมตารางชั่วคราว ข้อความค้นหาที่มีขนาดใหญ่ขึ้นจะทำให้ห้องเพิ่มประสิทธิภาพเพิ่มมากขึ้นแม้ว่าจะเป็นปัญหาที่น้อยกว่าก็ตาม จัดทำตารางชั่วคราวด้วยselect intoเนื่องจากการดำเนินการนี้ได้รับการบันทึกไว้น้อยที่สุด (มีกิจกรรมบันทึกน้อยกว่า) ซึ่งช่วยลดการโหลด I / O

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

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

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

  • ภาคแสดงที่ไม่มีประสิทธิภาพ สิ่งเหล่านี้อาจทำให้เกิดปัญหากับ sargs และ sub-optimization อื่น ๆ ที่ออกมาในลักษณะเดียวกับที่ทำกับคิวรี่ของทรานแซคชัน

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

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

ล็อค

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


1
+1 เนื่องจากนี่เป็นข้อมูลที่ยอดเยี่ยมเกี่ยวกับการปรับแต่งประสิทธิภาพ (ฉันมีความสุขที่ได้อยู่ในชั้นเรียนของ Kalen เธอรู้ว่าเธอกำลังทำอะไรอยู่!) คุณสามารถเพิ่มข้อมูลบางอย่างในมุมมองแบบไดนามิก
Wayne

3

คำแนะนำที่ดีที่สุด: ใช้ SQL Server 2008 และเรียกใช้การตรวจสอบกิจกรรมในขณะที่การทดสอบของคุณกำลังทำงาน บันทึกแบบสอบถามที่ใช้เวลานานที่สุด / มี I / O มากที่สุดเป็นต้นคลิกขวาที่คิวรีเหล่านั้นเพื่อดูแบบสอบถามและ / หรือแผนการดำเนินการ

ถัดไป: เรียนรู้ที่จะเข้าใจแผนการดำเนินการ

ถัดไป: ใช้ตัวช่วยสร้างการปรับฐานข้อมูล

ขั้นตอนเหล่านี้จะช่วยคุณสร้าง "คำแนะนำที่ดีที่สุด" ของคุณเอง


2

ebook ยอดเยี่ยมที่มีให้ฟรีจาก RedGate เกี่ยวกับวิธีการทำงานและทำความเข้าใจกับแผนการดำเนินการของ SQL Server

http://www.red-gate.com/specials/Grant.htm?utm_content=Grant080623

หน้าด้านเสียบผมอ้างอิงวัสดุการปรับแต่งประสิทธิภาพในบล็อกของฉันภายใต้ประสิทธิภาพของเซิร์ฟเวอร์ SQL

เมื่อคุณมีโอกาสที่จะย่อยเนื้อหานี้โปรดโพสต์ที่นี่หรือติดต่อฉันโดยตรงกับคำถามที่เฉพาะเจาะจง


1

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

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

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

ตรวจสอบให้แน่ใจว่าประโยคของคุณอยู่ที่ใด

เรียนรู้การอ่านแผนการดำเนินการ

ตรวจสอบให้แน่ใจว่าสำนักงานมีหนังสือดีๆสักเล่มเกี่ยวกับการปรับแต่งประสิทธิภาพ

ตัวแปรตารางดีกว่าตาราง temp ในบางกรณีและตาราง temp ทำงานได้ดีกว่าในกรณีอื่น ๆ หากคุณต้องการใช้ให้ลองใช้ทั้งคู่และดูว่าแบบใดทำงานได้ดีขึ้นในกรณีนั้น ๆ

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