การปิด WAITFOR ที่ไม่ จำกัด เพิ่มขนาดไฟล์บันทึกหรือไม่


16

ในแอปรุ่นล่าสุดของฉันฉันเพิ่มคำสั่งที่บอกให้รอเมื่อมีบางสิ่งเข้ามาในคิว Service Broker:

WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)

DBA บอกฉันว่าตั้งแต่การเพิ่มขนาดบันทึกได้ผ่านหลังคา สิ่งนี้ถูกต้องไหม หรือฉันควรจะมองหาที่อื่น?

คำตอบ:


17

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

เมื่อเร็ว ๆ นี้ฉันเริ่มแนะนำผู้คนให้หลีกเลี่ยง WAITFOR ในขั้นตอนการเปิดใช้งานพร้อมกับลูป เพียงแค่ออก RECIEVe แล้วเสร็จให้ปล่อยให้กลไกการเปิดใช้งานวนกลับมาให้คุณ (มันทำได้) และอย่า WAITFOR เพียงแค่รับธรรมดา

รสชาติของ WAITFOR ของ RECEIVE สร้างจุดประหยัดภายใน สิ่งนี้จะสร้างบันทึก (อย่างน้อย 3 บันทึกการเข้าสู่ระบบ) และจะตรึงการเข้าสู่ระบบในขณะที่รอ การมีไทม์เอาต์ WAITFOR ที่ยาวนาน (หรือแย่กว่านั้นคืออนันต์อันใดอันหนึ่ง) จะเป็นการฝึกฝนที่แย่มาก


1
จะWAITFOR (...) TIMEOUT 3600000แก้ปัญหาได้หรือไม่ เช่นปล่อยทุกชั่วโมง
AngryHacker

2
บันทึกของคุณจะเพิ่มขึ้นอย่างมากในหนึ่งชั่วโมง WAITFOR (REC EIVE) มีไว้สำหรับช่วงเวลาเช่น 5 วินาที ...
Remus Rusanu

1
คุณควรตรวจสอบว่าเหตุใดธุรกรรมของคุณจึงใช้งานได้จริง (มีบันทึกเป็นลายลักษณ์อักษร) รูปแบบตัวแทนบริการทั่วไปไม่ให้ออกเขียนใด ๆ ก่อนรับ
Remus Rusanu

1
ฉันไม่เข้าใจความคิดเห็นล่าสุดของคุณ การทำธุรกรรมใช้งานได้เพราะฉันออก a WAITFOR (RECEIVE...คุณสามารถขยายได้หรือไม่? บางทีฉันเข้าใจผิด
AngryHacker

8
begin transaction; waitfor(receive...)จะไม่สร้างบันทึกการใช้งานใด ๆ (จะไม่ 'เปิดใช้งาน' การทำธุรกรรม) ในขณะที่รอและจะไม่ตรึงบันทึก เพียง แต่begin transaction;[insert|update|delete];waitfor(receive...)จะทำให้เกิดการทำธุรกรรมที่ 'เปิดใช้งาน' (สร้างบันทึกเข้าสู่ระบบ) และทำให้ขาจริงจะบันทึกในขณะที่รอคอย
Remus Rusanu

5

บน SQL Server 2008 R2 ถ้าฉันเรียกใช้ WAITFOR (RECEIVE) จากนั้นเรียกใช้ DBCC OPENTRAN มันจะแสดงธุรกรรมเป็นแอ็คทีฟแม้ว่าจะไม่มีการอัพเดตก่อนหน้าก็ตาม


2
ถูกต้อง WAITFOR จะสร้างจุดเก็บบันทึกภายในและสิ่งนี้จะทริกเกอร์การเขียนบันทึกเพื่อให้เกิดการเข้าสู่ระบบแทน
Remus Rusanu


@binki ที่แสดงความคิดเห็นหมายถึง SQL Server 2005 สำหรับ 2008 R2 พวกเขาทำงานแตกต่างกันเกี่ยวกับปัญหานี้หากฉันจำได้อย่างถูกต้อง
Remus Rusanu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.