ฉันจะรับประกันได้อย่างไรว่าการแทรกไปยัง SQL Server 2008 R2 จะถูกแคชใน RAM ก่อน?


17

ลองนึกภาพสตรีมของข้อมูลที่ "ระเบิด" นั่นคือสามารถมี 10,000 เหตุการณ์มาถึงอย่างรวดเร็วตามด้วยอะไรสักอย่างในหนึ่งนาที

ป้อนคำอธิบายรูปภาพที่นี่

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

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


1
คุณกำลังพูดถึงรหัสลูกค้า C #? ดังนั้นคุณสนใจโค้ด SQL ที่ทำให้มั่นใจว่าการเขียนถูกแคชหรือไม่
Richard

6
ฉันมีแนวโน้มที่จะเข้าคิวเพื่อแทรกตัวเองแม้ว่า RDBMS จะสนับสนุนเพราะ (a) มันไม่ยาก (b) ทั้งหมดอยู่ภายใต้การควบคุมของคุณและ (c) ไม่ใช่ผู้ขายที่พึ่งพา

ฉันสนใจในรหัสลูกค้า C # ที่มีรหัส SQL เพื่อให้แน่ใจว่าการเขียนแคช อย่างไรก็ตาม I "m แน่ใจว่าผมสามารถทำงานร่วมกับตรง T-SQL และเขียนเอง C # เสื้อคลุมของฉัน.

คำตอบ:


11

คุณลองเขียนและดูว่าเกิดอะไรขึ้น? คุณมีขวดที่รู้จักหรือไม่?

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

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

หมายเหตุ: การเขียนทุกครั้งใน SQL Server จะไปทำดิสก์ซึ่งเป็นส่วนหนึ่งของโพรโทคอล Write Ahead Logging (WAL) สิ่งนี้ใช้กับรายการ t-log สำหรับการเขียนนั้น

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

แก้ไข:

สำหรับข้อควรพิจารณาทั้งหมดตามวรรคสุดท้ายข้างต้นให้เลื่อน LDF ของคุณสำหรับฐานข้อมูลนี้เป็นชุดดิสก์เฉพาะเพื่อประสิทธิภาพที่ดียิ่งขึ้น ทำตามฐานข้อมูลการจัดเตรียม (แต่ละรายการสำหรับ MDF / LDF) เป็นเรื่องปกติที่จะมีไดรฟ์ข้อมูลโหลหรือ 3 (ผ่าน SAN ปกติ) สำหรับเซิร์ฟเวอร์ฐานข้อมูลของคุณ


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

7

สิ่งนี้จะเป็นการละเมิดข้อกำหนดความทนทานจากกรด ( http://en.wikipedia.org/wiki/ACID ) นั่นคือถ้าแอปพลิเคชันของคุณ "เขียน" ข้อมูลลงใน RAM แล้วเซิร์ฟเวอร์ล่มข้อมูลของคุณจะหายไป

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


+1 ฉันควรจะพูดถึงเรื่องนี้ ต้องใช้ WAL สำหรับกรด
gbn

2

ฉันใช้หนึ่งครั้งชุดข้อมูลสำหรับสิ่งนี้ ฉันกำลังแทรกแถวไปยังชุดข้อมูลเมื่อมาถึงและมีเธรดอื่นที่ล้างแถวทุก 2 วินาทีหรือมากกว่านั้นไปยังฐานข้อมูล คุณยังสามารถใช้เอกสาร xml เพื่อทำ cachin จากนั้นส่งผ่าน xml ไปยังฐานข้อมูลในการโทรครั้งเดียวซึ่งอาจดีกว่านี้

ความนับถือ

Piotr

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