นี่เป็นคำถามที่ยอดเยี่ยมและฉันพบว่าคำตอบน่าสนใจ ฉันจะแสดงความคิดเห็นในเรื่องนี้เนื่องจาก Oracle DBA และคำตอบของฉันเฉพาะกับฐานข้อมูล Oracle นี่เป็นข้อผิดพลาดที่สำคัญที่ผู้คนจำนวนมากทำเมื่อทำงานกับ Oracle ฉันไม่แน่ใจว่าสิ่งนี้ใช้ได้กับแอปพลิเคชันอื่นเช่นกันหรือไม่ นี่ไม่ได้หมายความว่าจะเป็นหัวข้อ แต่เป็นคำตอบเฉพาะ
เมื่อคุณปรับแต่งประสิทธิภาพด้วย Oracle คุณกำลังมองหาการแก้ไขปัญหาคอขวด แม้ว่าพวกเราส่วนใหญ่ไม่ได้พูด แต่ก็มีพื้นฐานมาจากทฤษฎีข้อ จำกัด : https://en.wikipedia.org/wiki/Theory_of_constraints
หน่วยความจำอาจไม่ใช่คอขวดของคุณ Oracle มีกลไกที่ซับซ้อนในการจัดการหน่วยความจำและการเพิ่มหน่วยความจำอาจทำให้สิ่งต่าง ๆ ช้าลงได้หากพื้นที่อื่นเป็นที่ที่คอขวดอยู่ ขอยกตัวอย่างหนึ่งอย่างที่ธรรมดามาก
ข้อความค้นหาดูเหมือนจะช้า ฉันทามติคือถ้าเราเพิ่มแรมเราควรเพิ่มเวลาตอบสนองของเคียวรีเนื่องจากหน่วยความจำเร็วกว่าดิสก์ ดี ... นี่คือวิธีที่ออราเคิลจัดการกับการจัดการหน่วยความจำสำหรับข้อมูล Oracle มีตำแหน่งหน่วยความจำที่หลากหลายที่จัดสรรให้กับหน้าที่เฉพาะ ดังนั้นคุณสามารถเพิ่มความทรงจำเหล่านี้ พื้นที่ที่ใช้สำหรับข้อมูลเรียกว่า 'บัฟเฟอร์แคช' นี่คือชุดรายการที่เชื่อมโยง (จำนวนรายการมีแนวโน้มที่จะเพิ่มขึ้นในแต่ละรุ่น) ทุกครั้งที่พบบล็อกบนแผ่นดิสก์ในระหว่างการสืบค้นอัลกอริทึมแฮชจะถูกเรียกใช้เพื่อกำหนดรายการที่จะใส่เข้าไปในตำแหน่งที่จะวางลงในรายการจะขึ้นอยู่กับอัลกอริธึมการนับสัมผัส (อธิบายบนไซต์สนับสนุนของ Oracle ดังนั้นคุณต้องจ่ายเพื่อให้ได้ ... มันไม่สำคัญจริงๆ)
อย่างไรก็ตามเมื่อคุณเรียกใช้แบบสอบถาม Oracle จะทำการสลักในโซ่บัฟเฟอร์ที่คุณค้นหาในเวลานั้น LATCH นี้ (หมายเหตุ: นี่ไม่ใช่ล็อค Google "latch" หากคุณไม่ทราบความแตกต่าง) บล็อกการดำเนินการอื่น ๆ ทั้งหมดในสายโซ่นั้นตลอดระยะเวลาที่คุณอ่าน ดังนั้นจึงบล็อกการอ่านและเขียน (ซึ่งต่างจากการล็อกที่อ้างสิทธิ์โดย Oracle ไม่ได้บล็อกการอ่าน)
สิ่งนี้เป็นสิ่งจำเป็นเพราะเมื่อคุณอ่านบล็อกในกลุ่มนั้นออราเคิลจะทำการเคลื่อนย้ายไปมาโดยขึ้นอยู่กับว่า 'ร้องขอ' บ่อยแค่ไหน บล็อกที่มีการร้องขอบ่อยครั้งจะถูกย้ายไปด้านบนและบล็อกที่ร้องขอน้อยกว่าจะถูกทิ้งไว้ที่ด้านล่างและแสดงอายุ คุณไม่สามารถมี 2 เซสชันอ่านรายการที่เชื่อมโยงและบล็อกการเคลื่อนย้ายไปรอบ ๆ มิฉะนั้นคุณจะกดตัวชี้ที่ชี้ไปยังตำแหน่งที่ไม่มีอยู่จริง
เมื่อคุณเพิ่มขนาดของหน่วยความจำคุณจะเพิ่มขนาดของแต่ละรายการที่เชื่อมโยง เพิ่มเวลาในการอ่านรายการ แบบสอบถามที่ไม่ดีหรือแบบสอบถามที่ซับซ้อนสามารถทำหลายหมื่นหรือแม้กระทั่งหลายล้านอ่านรายการเชื่อมโยง การอ่านแต่ละครั้งรวดเร็ว แต่จำนวนของการอ่านจะนำไปสู่การยึดสลักและสิ่งเหล่านี้จะบล็อกเซสชันอื่น ๆ Oracle เรียกสิ่งนี้ว่า 'logical IO' (หรือ buffer รับหรือสิ่งอื่น ๆ ศัพท์แสงนี้เฉพาะกับ Oracle และอาจหมายถึงสิ่งอื่นในส่วนอื่น ๆ ของ IT)
ดังนั้นหากรายการยาวและคุณมี SQL ไม่ดีจริง ๆ คำสั่ง SQL จะถือ latches ได้นานขึ้น การเพิ่มหน่วยความจำในบางครั้งอาจลดประสิทธิภาพลง ส่วนใหญ่แล้วสิ่งนี้จะไม่เกิดขึ้น ผู้คนจะใช้เงินเป็นจำนวนมากและไม่เห็นประโยชน์ ตามที่กล่าวไว้มีหลายครั้งที่คุณต้องการหน่วยความจำเพิ่มเติมในบัฟเฟอร์แคช แต่คุณต้องระบุคอขวดอย่างถูกต้องเพื่อให้ทราบว่าสิ่งนี้เหมาะสมหรือไม่ ฉันไม่สามารถอภิปรายวิธีวิเคราะห์สิ่งนี้ในโพสต์นี้ ดูฟอรัม DBA บางคนพูดถึงที่นั่น มันค่อนข้างซับซ้อน
ใครบ้างมีตัวอย่างที่เฉพาะเจาะจงกับซอฟต์แวร์ชิ้นอื่น ๆ ที่สามารถเกิดขึ้นได้? มีหนังสือธุรกิจที่ยอดเยี่ยมที่เรียกว่า 'เป้าหมาย' ซึ่งกล่าวถึงการบรรเทาข้อ จำกัด ในโรงงาน กระบวนการนี้คล้ายกับสิ่งที่ Oracle DBAs ทำเมื่อประเมินปัญหาด้านประสิทธิภาพ มันมักจะอ่านมาตรฐานในโปรแกรม MBA มันมีค่ามากที่จะอ่านสำหรับอาชีพไอที
https://en.wikipedia.org/wiki/Eliyahu_M._Goldratt