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


10

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

ฉันจะยกตัวอย่าง สมมติว่าคุณมีอินสแตนซ์ของ SQL Server ที่มีเนื้อที่แคชแคชรวม 6GB ฉันเรียกใช้คิวรีที่มีการรวมหลายตัวที่อ่านข้อมูล 7GB ได้ SQL Server สามารถตอบสนองต่อคำขอนี้ได้อย่างไร มันเก็บข้อมูลชั่วคราวใน tempdb หรือไม่? มันล้มเหลวหรือไม่ มันทำสิ่งที่เพิ่งอ่านข้อมูลจากดิสก์และรวบรวมส่วนในเวลาหรือไม่

นอกจากนี้จะเกิดอะไรขึ้นถ้าฉันพยายามคืนข้อมูลทั้งหมด 7GB นั่นจะเปลี่ยนวิธีจัดการกับ SQL Server หรือไม่

ฉันรู้อยู่แล้วว่าหลายวิธีในการแก้ไขปัญหานี้ฉันแค่อยากรู้ว่า SQL Server จัดการกับคำขอนี้เป็นการภายในเมื่อทำงานตามที่ระบุไว้

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


1
ในแง่ของคนธรรมดา SQL Server จะเก็บตารางงานและผลลัพธ์ของการประมวลผลภายในของตัวเองใน tempdb หน้าถูกอ่านจากดิสก์เมื่อจำเป็น เพจจะยังคงอยู่ในหน่วยความจำจนกว่าจะถูกบังคับหรือเมื่อ SQL พร้อมที่จะส่งไปยังดิสก์ นี่คือเมื่อคุณเรียกใช้แบบสอบถามขนาดใหญ่ tempdb จะเติบโต ฉันได้เห็นข้อความค้นหาที่นำระบบมาที่หัวเข่าของมันเพราะ tempdb ได้รับอนุญาตให้ขยายการตรวจสอบและใช้พื้นที่ที่เหลือทั้งหมดในไดรฟ์ ฉันรู้ว่ามันไม่ถูกต้อง 100% เพียงแค่พยายามอธิบายอย่างง่ายๆ ส่วนที่ใช้ข้อมูลไม่ใช่ส่วนที่จัดการตำแหน่งของข้อมูลนั้น
datagod

คำตอบ:


13

หน้าจะถูกอ่านในหน่วยความจำตามต้องการหากไม่มีหน่วยความจำว่างหน้าเก่าที่ไม่ได้แก้ไขจะถูกแทนที่ด้วยหน้าขาเข้า

ซึ่งหมายความว่าหากคุณเรียกใช้คิวรีที่ต้องการข้อมูลมากกว่าที่จะสามารถใส่ในหน่วยความจำได้หลายหน้าจะมีชีวิตที่สั้นมากในหน่วยความจำทำให้เกิด I ​​/ O จำนวนมาก

คุณสามารถเห็นเอฟเฟกต์นี้ได้โดยดูที่ตัวนับ "Page Life Expectancy" ใน Windows Performance Monitor ดูhttps://sqlperformance.com/2014/10/sql-performance/knee-jerk-page-life-expectancyสำหรับรายละเอียดที่ดีเกี่ยวกับตัวนับนั้น

ในความคิดเห็นคุณถามเฉพาะสิ่งที่เกิดขึ้นเมื่อผลลัพธ์ของแบบสอบถามมีขนาดใหญ่กว่าพื้นที่บัฟเฟอร์ที่พร้อมใช้งาน ยกตัวอย่างที่ง่ายที่สุดselect * from some_very_big_table;- ถือว่าตารางคือ 32GB และmax server memory (MB)กำหนดค่าไว้ที่ 24GB ทั้งหมด 32GB ของตารางข้อมูลจะถูกอ่านในหน้าในหน้ากันชนหนึ่งที่เวลา, สลักจัดรูปแบบเป็นแพ็คเก็ตเครือข่ายและส่งข้ามสาย สิ่งนี้เกิดขึ้นทีละหน้า; คุณสามารถมีการค้นหา 300 ครั้งในเวลาเดียวกันและสมมติว่าไม่มีการบล็อกเกิดขึ้นข้อมูลสำหรับแต่ละแบบสอบถามจะถูกอ่านในพื้นที่บัฟเฟอร์ของหน้าหน้าในแต่ละครั้งและวางลงบนสายเร็วที่สุดเท่าที่ลูกค้าสามารถทำได้ ร้องขอและใช้ข้อมูล เมื่อข้อมูลทั้งหมดจากแต่ละหน้าถูกส่งไปที่การวางสายหน้าจะไม่เรียงกันและจะถูกแทนที่อย่างรวดเร็วโดยหน้าอื่นจากดิสก์

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

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


จากความอยากรู้แบบสอบถามชนิดใดที่ดึงข้อมูล 7GB ฉันหวังว่านี่เป็นกระบวนการแบทช์
datagod

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

5

ฉันไม่สามารถพูดในสิ่งที่คุณต้องการในสถานการณ์นี้ แต่ SQL Server มีหลายตัวเลือกขึ้นอยู่กับจำนวนที่ต้องการ

  • ข้อมูลสามารถ "กระจาย" ไปยัง TempDB ซึ่งจะเป็นการใช้ดิสก์ของคุณ
  • หน้าเก่าสามารถผลักออกจากแคชบัฟเฟอร์ของคุณ
  • SQL Server สามารถโหลดบางหน้าเพื่อบัฟเฟอร์แคชใช้แล้วหมุนหน้าใหม่

วิธีที่ดีที่สุดในการค้นหาว่าจะเกิดอะไรขึ้นคือการสร้างสถานการณ์ในสภาพแวดล้อมการพัฒนาและค้นหา


2

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

ในการตอบส่วนที่เฉพาะเจาะจงนี้ให้ฉันบอกคุณว่าสิ่งนี้ได้รับการจัดการอย่างไร หน้ามีขนาด 8KB เมื่อคุณเรียกใช้แบบสอบถามที่ร้องขอชุดข้อมูลขนาดใหญ่และต้องการหน้าจำนวนมากที่จะนำเข้าสู่หน่วยความจำ SQL Server จะไม่นำหน้าทั้งหมดในครั้งเดียว มันจะค้นหาหน้าที่เฉพาะเจาะจงและนำหนึ่งหน้า 8KB เดียวในหน่วยความจำอ่านข้อมูลออกมาจากมันและให้ผลลัพธ์และสิ่งนี้จะดำเนินต่อไปในขณะนี้สมมติว่าหน้าสถานการณ์ที่หน่วยความจำน้อยลงในกรณีที่หน้าเก่าจะถูกฟลัช ดิสก์เช่น @Max ชี้ให้เห็น ตามที่คุณคาดเดาได้อย่างถูกต้องหน่วยความจำต่ำนี้อาจทำให้บางสิ่งบางอย่างช้าลงเนื่องจากบางครั้งจะใช้ในการลบหน้าเก่าออก นี่คือจุดตรวจและ Lazywriterเข้ามาในภาพ Lazywriter เป็นของพวกเขาเพื่อให้แน่ใจว่ามีหน่วยความจำว่างอยู่เสมอเพื่อนำหน้าใหม่ไปยังดิสก์ เมื่อพบบัฟเฟอร์ว่างต่ำมันจะถูกทริกเกอร์และสร้างพื้นที่ว่างเพื่อเป็นหน้าใหม่

แก้ไข

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

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

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

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


ฉันเข้าใจแล้ว แต่ส่วนที่ทำให้ฉันงุนงงเล็กน้อยคือสิ่งที่เกิดขึ้นหากคุณเข้าร่วม \ กรองข้อมูลและผลลัพธ์เหล่านั้นมีขนาดเกินกว่าขนาดของแคช ข้อมูลจะต้องได้รับการรวบรวมเพื่อสร้างชุดการส่งคืน แต่ชุดการส่งคืนจะยิ่งใหญ่กว่าขนาดของแคช ยังคงวนรอบหน้าผ่านแคชจนกว่าจะสร้างผลลัพธ์สุดท้ายหรือไม่ ความคิดของฉันจะเป็นว่ามันจะเขียนผลลัพธ์ไปยัง tempdb เนื่องจากเกินแคชแล้วอ่านจากดิสก์นั้น แต่ไม่ทราบว่าเป็นเช่นนั้นหรือไม่
Dustin

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