มีวิธีบังคับให้ดัชนีอยู่ในหน่วยความจำด้วย SQL Server 2008 หรือไม่?


10

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

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

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

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

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

ฉันรู้ว่าโดยปกติแล้วสิ่งที่ดีที่สุดคือการไม่ยุ่งกับ SQLServer ซึ่งเกี่ยวข้องกับสิ่งต่าง ๆ แต่ลักษณะที่ผิดปกติของข้อความค้นหาของฉัน (ทำงานน้อยมาก แต่ไม่ค่อยสำคัญเวลา) ทำให้ฉันเชื่อว่ามันสมเหตุสมผล .

ฉันยังอยากรู้ว่าถ้ามีวิธีที่จะรู้ว่าดัชนีใดถูกแคชในหน่วยความจำในเวลาที่กำหนด?

คำตอบ:


13

เคยมีDBCC PINTABLEคำสั่ง แต่ฉันเชื่อว่าหยุดทำงานใน 6.5 หรืออาจ 7.0 คำสั่งอาจจะยังคงแนะนำว่ามันทำงานได้ถ้าคุณลองมัน แต่มันเพิ่งกลับมามันเป็น no-op

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

สำหรับดัชนีใดที่อยู่ในหน่วยความจำคุณสามารถรับแนวคิดคร่าวๆsys.sm_os_buffer_descriptorsได้ ฉันเผยแพร่เคล็ดลับเกี่ยวกับสิ่งนี้:

http://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/


อืมตามสคริปต์นั้นตาราง 75 MB มีพูลบัฟเฟอร์ 900 MB เป็นเรื่องปกติ / เป็นไปได้ไหม?
db2

1
@ db2 คุณมีดัชนีกี่รายการ?
JNK

2
มันแยกส่วนอย่างไร ... มันคือการวัดหน้าไม่ใช่ข้อมูล หน้าเว็บของคุณอาจว่างเปล่าและอาจทำให้เกิดการวัดที่สูงเกินจริง
Aaron Bertrand

0

ลองใช้KEEPPLANและคำแนะนำแบบสอบถามKEEPPLAN FIXED

KEEPPLAN บังคับให้เครื่องมือเพิ่มประสิทธิภาพข้อความค้นหาคลายเกณฑ์การรวบรวมใหม่โดยประมาณสำหรับแบบสอบถาม

KEEPFIXED PLAN บังคับให้เครื่องมือเพิ่มประสิทธิภาพการสืบค้นไม่ต้องคอมไพล์แบบสอบถามซ้ำเนื่องจากการเปลี่ยนแปลงทางสถิติ การระบุแผน KEEPFIXED ทำให้แน่ใจว่าแบบสอบถามจะถูกคอมไพล์ใหม่เฉพาะเมื่อสคีมาของตารางที่มีการเปลี่ยนแปลงหรือถ้าดำเนินการ sp_recompile กับตารางเหล่านั้น

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