ฉันอาจไม่ได้ แต่ฉันพยายามตอบมัน
คุณบอกว่าคุณต้องการโซลูชันประสิทธิภาพสูงที่ทำงานบ่อยครั้ง (อย่างน้อย 2 นาที) และคุณต้องการแนวทางที่ดีซึ่งควรรวดเร็วโดยไม่ล็อค แต่คุณไม่ต้องการระบบ blackbox
แทนที่จะเป็นระบบแบล็กบ็อกซ์ที่ใช้กับการติดตั้งหลายล้านครั้งด้วยผลลัพธ์ที่ดีคุณลองคิดค้นวงล้ออีกครั้งและสร้างโซลูชันของคุณเอง? อืมฟังดูแปลกไปหน่อย
อันที่จริงนี่คือคำแนะนำของฉัน
- การจำลองแบบแม้ว่าคุณจะบอกว่าคุณจะไม่ใช้มัน มันเป็นวิธีแก้ปัญหาที่ง่ายและดีที่สุดที่คุณสามารถใช้ได้ การจำลองแบบง่ายต่อการติดตั้งทำซ้ำอย่างรวดเร็วและคุณไม่ต้องคิดค้นวงล้ออีก หากคุณเพียงแค่แปลกเกี่ยวกับการล็อกคุณอาจพยายามที่จะตั้งค่าการ
ISOLATION LEVEL
READ_COMMITTED_SNAPSHOT
คุณสามารถอ่านเพิ่มเติมได้ที่นี่ สิ่งนี้จะใช้เป็นส่วนหนึ่งของ tempdb ของคุณ แต่ตารางของคุณจะอ่านและเขียนได้และการจำลองแบบสามารถทำงานในพื้นหลังได้
ดูตัวอย่างด้านล่าง:
ALTER DATABASE yourDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE yourDatabase SET READ_COMMITTED_SNAPSHOT ON
- CDC (Change Data Capture) สามารถเป็นโซลูชันได้เช่นกัน แต่วิธีนี้คุณต้องสร้างเกือบทุกอย่างด้วยตัวเอง และฉันได้ทำประสบการณ์ที่
CDC
อาจเป็นสิ่งที่เปราะบางในบางสถานการณ์ CDC
จะรวบรวมข้อมูลทั้งหมดในตารางเฝ้าดู (คุณต้องระบุแต่ละตารางที่จับตาดูด้วยตนเอง) หลังจากนั้นคุณจะได้รับความคุ้มค่าก่อนและความคุ้มค่าหลังจากที่INSERT
, หรือUPDATE
จะระงับข้อมูลเหล่านั้นเป็นระยะเวลาหนึ่ง (คุณสามารถระบุด้วยตัวคุณเอง) วิธีนี้อาจใช้กับบางตารางที่คุณต้องดูและทำซ้ำการเปลี่ยนแปลงเหล่านั้นไปยังฐานข้อมูลอื่นด้วยตนเอง โดยวิธีการใช้การจำลองแบบเซิร์ฟเวอร์ SQL ภายใต้ประทุนเช่นกัน ;-) คุณสามารถอ่านเพิ่มเติมได้ที่นี่DELETE
CDC
CDC
CDC
คำเตือน: CDC
จะไม่รับรู้ถึงการDDL
เปลี่ยนแปลง ซึ่งหมายความว่าหากคุณเปลี่ยนตารางและเพิ่มคอลัมน์ใหม่CDC
จะดูตาราง แต่ไม่สนใจการเปลี่ยนแปลงทั้งหมดในคอลัมน์ใหม่ ในความเป็นจริงมันจะบันทึกNULL
เป็นค่าก่อนและค่าหลังจากเท่านั้น คุณต้องกำหนดค่าเริ่มต้นใหม่หลังจากDDL
เปลี่ยนเป็นตารางที่จับตาดู
- วิธีที่คุณอธิบายไว้ข้างต้นเป็นสิ่งที่ต้องการจับภาพปริมาณงานโดยใช้ SQL Server Profiler และรันอีกครั้งบนฐานข้อมูลอื่นสำหรับการวัดประสิทธิภาพบางอย่าง มันสามารถทำงานได้ดี แต่ความจริงที่ว่ามีผลข้างเคียงมากเกินไปนั้นค่อนข้างหนักเกินไปสำหรับฉัน คุณจะทำอย่างไรถ้าคุณจับขั้นตอนการเรียกลูกค้าของคุณ หลังจากนั้นรันคำสั่งเดียวกันที่ฐานข้อมูลหลักของคุณเนื่องจากไม่ซิงค์? กระบวนการนี้อาจทำงานได้ แต่อาจลบ / อัปเดต / แทรกแถวที่ไม่ปรากฏในไคลเอนต์ของคุณ หรือคุณจัดการกับลูกค้าหลายคนด้วยหลักการเดียวได้อย่างไร ฉันคิดว่านี่เป็นเรื่องยุ่งยากเกินไป ในกรณีที่เลวร้ายที่สุดคุณอาจทำลายความซื่อสัตย์ของคุณ
- แนวคิดอื่นอาจเป็นไปตามแอปพลิเคชันหรือใช้ทริกเกอร์ ขึ้นอยู่กับจำนวนตารางที่คุณต้องการซิงค์ คุณสามารถเขียนการเปลี่ยนแปลงทั้งหมดไปยังตาราง staging แยกต่างหากและรันงาน SQL Server Agent ทั้งหมด x นาทีเพื่อซิงค์แถวเหล่านั้นในตาราง staging กับต้นแบบของคุณ แต่นี่อาจจะหนักไปหน่อยถ้าคุณพยายามทำการซิงค์ (เช่น) 150 ตาราง คุณจะมีค่าใช้จ่ายใหญ่
นี่คือ 2 เซ็นต์ของฉัน หวังว่าคุณจะได้ภาพรวมที่ดีและบางทีคุณอาจพบวิธีแก้ปัญหาที่เหมาะกับคุณ