คำสั่ง SQL Server เพื่อล้างแคชก่อนเรียกใช้การเปรียบเทียบประสิทธิภาพ


46

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

ในการค้นหาโดย Google ฉันสามารถค้นหาคำสั่งเหล่านี้ได้:

DBCC FREESYSTEMCACHE
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE

อันที่จริงแล้วข้อความค้นหาของฉันใช้เวลาในการดำเนินการหลายครั้งกว่าจริงกว่าเดิม อย่างไรก็ตามฉันไม่แน่ใจว่านี่เป็นเทคนิคที่แนะนำ

วิธีปฏิบัติที่ดีที่สุดคืออะไร

คำตอบ:


43

โดยส่วนตัวแล้วสำหรับการสืบค้นทั่วไปการประหารชีวิตครั้งที่ 2 และต่อมามีความสำคัญมากกว่า

คุณกำลังทดสอบดิสก์ IO หรือประสิทธิภาพการค้นหา

สมมติว่าคิวรีของคุณทำงานบ่อยและมีความสำคัญคุณต้องวัดว่าภายใต้สภาพชีวิตจริง และคุณไม่ต้องการล้างแคชเซิร์ฟเวอร์ Prod ในแต่ละครั้ง ...

ถ้าคุณต้องการคุณทำได้:

  • DBCC DROPCLEANBUFFERSล้างหน้าสะอาด (ไม่ได้แก้ไข) จากบัฟเฟอร์พูล
    นำหน้าด้วยการCHECKPOINTล้างหน้าสกปรกไปยังดิสก์ก่อน
  • DBCC FLUSHPROCINDB ล้างแผนการดำเนินการสำหรับฐานข้อมูลนั้น

ดูที่ (ใน DBA.SE ด้วย)


3
มีข้อผิดพลาดขณะทำงานDBCC FLUSHPROCINDB: มีการระบุจำนวนพารามิเตอร์ที่ไม่ถูกต้องในคำสั่ง DBCC
Xin

ในที่สุดก็พบว่า: DECLARE @myDb AS INT = DB_ID(); DBCC FLUSHPROCINDB(@myDb); GOจากที่นี่: stackoverflow.com/questions/7962789/…
Hans Vonn

14

คำตอบล่าช้า แต่อาจใช้กับผู้อ่านคนอื่น ๆ

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

โปรดทราบว่าคำสั่งนี้ไม่ควรรันในสภาพแวดล้อมการใช้งานจริง การรันคำสั่งนี้จะส่งผลให้แคชบัฟเฟอร์ว่างเปล่าเป็นส่วนใหญ่ การรันเคียวรีใด ๆ หลังจากเรียกใช้งานคำสั่ง DROPCLEANBUFFERS ของ DBCC จะใช้การอ่านแบบฟิสิคัลเพื่อนำข้อมูลกลับเข้าไปในแคชซึ่งน่าจะช้ากว่าหน่วยความจำมาก

อีกครั้งให้ปฏิบัติตามคำสั่งนี้คล้ายกับ DBCC FREEPROCCACHE - ไม่ควรรันบนเซิร์ฟเวอร์ที่ใช้งานจริงใด ๆ เว้นแต่คุณจะรู้ว่ากำลังทำอะไรอยู่

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

เรียนรู้เพิ่มเติมได้ที่: http://www.sqlshack.com/insight-into-the-sql-server-buffer-cache/


9

ฉันบอกให้ใช้เสมอ:

dbcc dropcleanbuffers;

จากMSDN :

ใช้ DBCC DROPCLEANBUFFERS เพื่อทดสอบคิวรีที่มีแคชบัฟเฟอร์เย็นโดยไม่ต้องปิดและรีสตาร์ทเซิร์ฟเวอร์

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


2
บวก: DBCC FREEPROCCACHEเพื่อล้างแผนการดำเนินการแคชใด ๆ ...
marc_s

1
เฉพาะในกรณีที่คุณต้องการทดสอบ IO แน่นอน ...
gbn

3

คำตอบอื่น ๆ ที่ถูกต้องเกี่ยวกับเหตุผลที่จะไม่DBCC FREEPROCCACHEทำงาน อย่างไรก็ตามมีเหตุผลสองสามประการที่ต้องทำ:

  1. ความมั่นคง

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

หากคุณต้องการทดสอบประสิทธิภาพแคชร้อนแรงโปรดตรวจสอบให้แน่ใจว่ารันคิวรีหลายครั้งสลับกันและทิ้งการรันสองครั้งแรก เฉลี่ยผลลัพธ์

  1. ประสิทธิภาพที่แย่ที่สุด

สมมติว่าคุณมีคิวรีซึ่งใช้เวลาหนึ่งวินาทีกับแคชร้อน แต่หนึ่งนาทีกับแคชเย็น การปรับให้เหมาะสมซึ่งทำให้การสืบค้นในหน่วยความจำช้าลง 20% แต่การสืบค้น IO-bound ที่เร็วขึ้น 20% อาจเป็นชัยชนะครั้งใหญ่: ในระหว่างการดำเนินการตามปกติจะไม่มีใครสังเกตเห็นการเพิ่ม 200 ms ภายใต้สถานการณ์ปกติ แต่ถ้ามีอะไรบังคับ ทำงานกับดิสก์โดยใช้เวลา 48 วินาทีแทนที่จะเป็น 60 อาจช่วยลดการขายได้

นี่เป็นข้อกังวลน้อยเกี่ยวกับระบบที่ทันสมัยที่มีหน่วยความจำหลายสิบกิกะไบต์และที่จัดเก็บข้อมูล SAN และ SSD ที่ค่อนข้างเร็ว แต่ก็ยังคงสำคัญ หากนักวิเคราะห์บางคนเรียกใช้การค้นหาแบบสแกนตารางจำนวนมากกับฐานข้อมูล OLTP ของคุณซึ่งจะลบแคชบัฟเฟอร์ครึ่งหนึ่งของคุณการสืบค้นที่มีประสิทธิภาพในการจัดเก็บจะช่วยให้คุณสำรองข้อมูลได้เร็วขึ้น

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