SQL Server เก็บผลลัพธ์ของกระบวนการแคชข้อมูลหรือไม่


11

ฉันเคยได้ยินเรื่องนี้จากเพื่อน แต่ฉันไม่เคยตรวจสอบว่าเรื่องนี้เป็นเรื่องจริงหรือไม่

เป็นความจริงหรือไม่ที่ผลลัพธ์ข้อมูลของคิวรีที่ดำเนินการถูกเก็บไว้ในแคช?

ฉันหมายถึงถ้าฉันมีขั้นตอนการจัดเก็บเช่น:

SELECT * FROM USERLIST

... เป็นความจริงหรือไม่ที่ผลลัพธ์ (รายการผู้ใช้ในกรณีนี้) ถูกเก็บไว้ในแคช

นอกจากนี้ถ้าฉันมีสิ่งเหล่านี้:

SELECT * FROM USERLIST WHERE user="user"
SELECT * FROM USERLIST WHERE user="userzzz"

(ผู้ใช้ / userzzz ถูกส่งผ่านเป็นพารามิเตอร์) ถูกต้องหรือไม่ว่ามันเก็บผลลัพธ์ที่แตกต่างกัน 2 รายการไว้ในแคชฐานข้อมูล

ฉันไม่คิดอย่างนั้น แต่ฉันต้องการคำยืนยันจากคุณผู้เชี่ยวชาญ!


เพิ่งตอบตอนนี้สำหรับคุณโดย marc_s stackoverflow.com/questions/8559443/…

คำตอบ:


19

ผลลัพธ์การค้นหาจะไม่ถูกแคช

อย่างไรก็ตามตารางต้นฉบับและข้อมูลดัชนีและข้อมูลเมตาจะถูกแคชหลังจากการใช้งานครั้งที่ 1 (ขึ้นอยู่กับการใช้งานอย่างต่อเนื่องโหลดและความดันหน่วยความจำ)

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

แผนการดำเนินการที่รวบรวมจะถูกแคชซึ่งเป็นที่ที่ความสับสนมาจากฉันสงสัยว่า


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

@markzzz: SQL เกือบทั้งหมดถูกคอมไพล์ไปยังแผนการดำเนินการไม่ว่าจะเป็น UPDATE โดยตรง, SELECT หรือโพรซีเดอร์ที่เก็บไว้
gbn

6

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

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


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

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


6

เมื่อมีการสอบถามพร้อมที่จะได้รับการประมวลผลโดยใช้ SQL Server ผู้จัดการ SQL ดูมันได้ในcache; และถ้ามันไม่อยู่ตรงนั้นมันจะต้องถูกรวบรวม กระบวนการรวบรวมนั้นครอบคลุมบางสิ่ง

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

ตรวจสอบCompilation and Executionส่วนใน Internals และ Architecture ของ Microsoft SQL Server Query Processor เพื่อดูข้อมูลโดยละเอียดเกี่ยวกับการประมวลผลแบบสอบถามเป็นต้น

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

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


-1

SQL Server จะผ่านขั้นตอนเหล่านี้เพื่อดำเนินการแบบสอบถามใด ๆ (เรียกขั้นตอนการจัดเก็บหรือคำสั่ง ad-hoc SQL):

1) ตรวจสอบไวยากรณ์โดยใช้แบบสอบถาม
2) หากใช้ได้ - ตรวจสอบแคชแผนเพื่อดูว่ามีแผนการดำเนินการสำหรับแบบสอบถามนั้น
3) หากมีแผนการดำเนินการ - แผนนั้นใช้ (อีกครั้ง) และแบบสอบถามดำเนินการ
4) หากยังไม่มีแผนแผนดำเนินการจะถูกกำหนด
5) แผนนั้นถูกเก็บไว้ในแคชแผนเพื่อนำมาใช้ใหม่ในภายหลัง
6) การดำเนินการแบบสอบถาม

(สำเนาคำตอบ Marc_s)


-1

ตามที่คนอื่นได้ระบุไว้ผลลัพธ์แบบสอบถามใน SQL Server จะไม่ถูกแคช

หากคุณต้องการแคชผลลัพธ์ของแบบสอบถาม (หรือ SP) แสดงว่ามีวิธีแก้ไขเฉพาะหน้า ตัวอย่างเช่นดูบทความนี้ได้ที่เว็บไซต์ของ Brent Ozar

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