ดัชนีใช้หน่วยความจำหรือไม่


10

ฉันเพิ่งเริ่มเรียนรู้เกี่ยวกับการใช้หน่วยความจำบน SQL Server เมื่อใช้แบบสอบถามในคำตอบของคำถามSQL Server 2008 R2 "Ghost Memory" ฉันค้นพบว่าฐานข้อมูลเดียวใช้พื้นที่แบ่งส่วนของสิงโตในบัฟเฟอร์พูล ดูเพิ่มเติมการใช้sys.allocation_unitsและsys.indexesฉันยืนยันว่าน่าจะเกิดจากการใช้ดัชนีจำนวนมากในฐานข้อมูล ดัชนีส่วนใหญ่เป็นกลุ่ม

นักพัฒนาฐานข้อมูลรายอื่นเชื่อว่าเรากำลังประสบปัญหาหน่วยความจำบนเซิร์ฟเวอร์ - ข้อความค้นหาเริ่มต้นทำงานได้นานเนื่องจากไม่มีหน่วยความจำที่พร้อมใช้งาน

คำถามของฉันคือ - การใช้ดัชนีเหล่านี้และการมีอยู่ของพวกเขาในบัฟเฟอร์พูลทำให้มีหน่วยความจำว่างสำหรับกระบวนการอื่นหรือไม่?


2
"Another database developer believes we are having memory issues on the server"- ขึ้นอยู่กับอะไร เซิร์ฟเวอร์มี RAM เท่าใดมีการตั้งค่าหน่วยความจำอินสแตนซ์อะไรและมีการใช้หน่วยความจำแคชโพรซีเดอร์เท่าใด
Jon Seigel

ขึ้นอยู่กับเวลาของการสอบถามที่เพิ่มขึ้นและการดูตัวจัดการงาน - ซึ่งงานวิจัยของฉันระบุว่าเป็น "คนโกหกที่สกปรกและสกปรก" (ขอบคุณ Brent Ozar - brentozar.com/archive/2011/09/ … ) ฉันอาจพบว่าไม่มีปัญหาหน่วยความจำ - ฉันทำตามคำแนะนำทั้งหมดที่ให้ไว้ในความคิดเห็นและคำตอบ!
JHFB

2
เนื่องจากเรากลิ้งลูกบอล 8 ลูกที่นี่ฉันคิดว่าข้อความค้นหาทำงานช้าเพราะพวกเขาเขียนโดยผู้พัฒนาฐานข้อมูล 'อีกคน' ...
Remus Rusanu

คำตอบ:


12

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

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

หากต้องการดูรายละเอียดของหน้าดัชนีในแคชข้อมูลของคุณคุณสามารถเรียกใช้แบบสอบถามด้านล่าง:

select
    count(*) as total_page_count,
    count(*) * 8 as total_consumption_kb,
    sum(row_count) as total_row_count
from sys.dm_os_buffer_descriptors
where page_type = 'INDEX_PAGE'
group by page_type

หากต้องการรับสถิติเหล่านี้ตามฐานข้อมูล:

select
    db_name(database_id) as database_name,
    count(*) as total_page_count,
    count(*) * 8 as total_consumption_kb,
    sum(row_count) as total_row_count
from sys.dm_os_buffer_descriptors
where page_type = 'INDEX_PAGE'
group by database_id
order by total_consumption_kb desc

อายุขัยที่เหมาะสม (?) อายุการใช้งานของหน้า - 4234 ฉันต้องวิจัยอัตราส่วนบัฟเฟอร์แคชและมองเข้าไปในส่วนอื่น ๆ
JHFB

PLE นั้นไม่แสดงความกดดันหน่วยความจำเลย อะไรก็ตามมากกว่า 1,000 ข้อเป็นกฎง่ายๆ (แน่นอนมี "ขึ้นอยู่กับ" เสมอ) เป็นที่ยอมรับ
Thomas Stringer

อัตราส่วนการเข้าถึงแคชของบัฟเฟอร์อาจทำให้เข้าใจผิดมากหรือออกและไม่ใช้ประโยชน์ ดูการโต้วาที SQL Server ที่ยอดเยี่ยม: อัตราส่วนการแคชแคชของ @JonathanKehayias
Mark Storey-Smith

@ MarkStorey-Smith สังเกตขอบคุณสำหรับตัวชี้!
Thomas Stringer

@JHFB ลองย้อนกลับไปก่อน อะไรทำให้คุณคิดว่าคุณมีความกดดันด้านความจำ?
Thomas Stringer

7

ดัชนีใช้พื้นที่บัฟเฟอร์พูลใช่ นี่คืออีกหนึ่งเหตุผลที่คุณควรใส่ใจกับกลยุทธ์การจัดทำดัชนีของคุณและลดการซ้ำซ้อน

ฉันยืนยันว่าอาจเกิดจากการใช้ดัชนีจำนวนมากในฐานข้อมูล ดัชนีส่วนใหญ่เป็นกลุ่ม

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

บทความของ Kimberley Tripp เกี่ยวกับตัวเลือกที่สำคัญในกลุ่มเป็นข้อมูลอ้างอิงที่ยอดเยี่ยมสำหรับสิ่งนี้


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