NOLOCK (คำใบ้เซิร์ฟเวอร์ Sql) เป็นการปฏิบัติที่ไม่ดีหรือไม่?


125

ฉันอยู่ในธุรกิจการทำเว็บไซต์และแอพพลิเคชั่นที่ไม่สำคัญ -> เช่น ซอฟต์แวร์การธนาคารการบินอวกาศแอปพลิเคชันการตรวจสอบผู้ป่วยหนัก ฯลฯ คุณจะได้รับแนวคิด

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

ฉันยังบอกด้วยว่านี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยมหากฉันประสบปัญหาล็อคตาย ดังนั้นฉันจึงเริ่มทำตามความคิดนั้นเป็นเวลาสองสามปีจนกระทั่งผู้เชี่ยวชาญด้าน Sql ช่วยฉันด้วยโค้ดแบบสุ่มและสังเกตเห็น NOLOCKS ทั้งหมดในโค้ด sql ของฉัน ฉันถูกดุอย่างสุภาพและเขาพยายามอธิบายให้ฉันฟัง (ทำไมมันถึงไม่ใช่เรื่องดี) และฉันก็หลงทาง ฉันรู้สึกว่าแก่นแท้ของคำอธิบายของเขาคือ 'มันเป็นวิธีแก้ปัญหาแบบวงดนตรีสำหรับปัญหาที่ร้ายแรงกว่า .. โดยเฉพาะอย่างยิ่งถ้าคุณกำลังประสบกับภาวะชะงักงัน ดังนั้นแก้ไขต้นตอของปัญหา '

เมื่อเร็ว ๆ นี้ฉันได้ทำ googling เกี่ยวกับเรื่องนี้และเจอโพสต์นี้

ดังนั้นอาจารย์ sql db guru อาจารย์ช่วยสอนหน่อยได้ไหม


ฉันไม่เข้าใจแซมคุณกำลังบอกว่าให้ใช้การแยก Snapshot ถ้าเป็นเว็บไซต์ที่มีการอ่านมาก แต่คุณก็บอกว่า SO ทำอย่างนั้นแล้วมันแย่เหรอ? หรือเพียงแค่ใช้ NOLOCK?
Pure.Krome

คำตอบ:


67

กับคำใบ้ NOLOCK ระดับแยกรายการสำหรับคำสั่งSELECT READ UNCOMMITTEDซึ่งหมายความว่าแบบสอบถามอาจเห็นข้อมูลสกปรกและไม่สอดคล้องกัน

นี่ไม่ใช่ความคิดที่ดีที่จะใช้เป็นกฎ แม้ว่าพฤติกรรมการอ่านสกปรกนี้จะใช้ได้สำหรับแอปพลิเคชันบนเว็บที่สำคัญสำหรับภารกิจของคุณ แต่การสแกน NOLOCK อาจทำให้เกิดข้อผิดพลาด 601 ซึ่งจะยุติการสืบค้นเนื่องจากการเคลื่อนย้ายข้อมูลอันเป็นผลมาจากการไม่มีการป้องกันการล็อก

ฉันขอแนะนำให้อ่านWhen Snapshot Isolation Help and When It Hurts - MSDN แนะนำให้ใช้ READ COMMITTED SNAPSHOT แทน SNAPSHOT ในสถานการณ์ส่วนใหญ่


1
เร็กซ์โปรดอย่าลังเลที่จะเพิ่มหมายเหตุเกี่ยวกับการแยกสแนปชอต
Sam Saffron

2
ใช่แซมกำลังพูดถึงการแยก Snapshot และคุณกำลังแนะนำให้อ่าน Committed Snapshot ฉันสับสนมาก: P (และฉันยังไม่ได้เจาะลึกบทความด้วย!)
Pure.Krome

2
มีประโยชน์ในบางครั้ง แต่ไม่ปกติสำหรับการผลิต ฉันใช้บ่อยครั้งในการดึงตัวอย่างข้อมูลเพื่อทดสอบหรือสร้างรายงานโดยที่ฉันส่วนใหญ่สนใจเกี่ยวกับลำดับขนาดคร่าวๆซึ่งการอ่านสกปรกจะไม่สำคัญ
TimothyAWiseman

NOLOCK == ฉันไม่สนใจว่าจะพลาดแถวที่ผูกมัดหรือไม่รวมแถวที่ไม่ได้รับคำสั่งในบางกรณีแถวเดียวกันจะถูกส่งคืนมากกว่าหนึ่งครั้งและในกรณีที่หายากมากจะส่งคืนแถวที่ไม่ตรงกับคำค้นหาของฉัน (ดูblogs.msdn.com/b/sqlcat/archive/2007/02/01/…พบจาก SO q'n อื่นในหัวข้อนี้)
Andrew Hill

106

ก่อนที่จะทำงานกับ Stack Overflow ฉันไม่เห็นNOLOCKด้วยกับหลักการที่ว่าคุณสามารถดำเนินการSELECTกับNOLOCKและได้ผลลัพธ์กลับมาพร้อมกับข้อมูลที่อาจล้าสมัยหรือไม่สอดคล้องกัน ปัจจัยที่ต้องพิจารณาคือจำนวนระเบียนที่อาจถูกแทรก / อัปเดตในเวลาเดียวกันกระบวนการอื่นอาจเลือกข้อมูลจากตารางเดียวกัน หากสิ่งนี้เกิดขึ้นมากแสดงว่ามีความเป็นไปได้สูงที่จะเกิดการชะงักงันเว้นแต่คุณจะใช้โหมดฐานข้อมูลเช่นREAD COMMITED SNAPSHOT.

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

ถามตัวเองเมื่อคิดจะใช้NOLOCK:

แบบสอบถามของฉันมีตารางที่มีINSERT/ UPDATEคำสั่งจำนวนมากหรือไม่และฉันสนใจว่าข้อมูลที่ส่งคืนจากแบบสอบถามอาจไม่มีการเปลี่ยนแปลงเหล่านี้ในช่วงเวลาที่กำหนดหรือไม่

หากคำตอบคือไม่ให้ใช้NOLOCKเพื่อปรับปรุงประสิทธิภาพ


ฉันเพิ่งทำการค้นหาอย่างรวดเร็วสำหรับNOLOCKคำหลักภายในฐานรหัสสำหรับ Stack Overflow และพบ 138 อินสแตนซ์ดังนั้นเราจึงใช้มันในไม่กี่แห่ง


7
IMO นี่ค่อนข้างง่าย การหยุดชะงักสามารถลบออกได้โดยใช้ดัชนีที่ปิดกั้นเอาแรงดันออกจากดัชนีคลัสเตอร์
Mitch Wheat

8
ฉันไม่ต้องการลดความสำคัญของการครอบคลุมดัชนีที่ดี มีหลายครั้งที่การสืบค้นโดยใช้ NOLOCK สามารถเพิ่มประสิทธิภาพเพิ่มเติมนอกเหนือจากผลกำไรที่ได้รับจากดัชนีบนตารางที่มีการแทรก / อัพเดตจำนวนมาก ความเร็วในการสืบค้นบน Stack Overflow เป็นสิ่งสำคัญยิ่งแม้ว่าจะมีข้อมูลที่ไม่ถูกต้องหรือขาดหายไปก็ตาม
Geoff Dalgas

9
เห็นได้ชัดว่าหนึ่งจะได้รับแถวที่ซ้ำกันNOLOCKโดยใช้ ซึ่งหมายความว่าฉันต้องลดคะแนนคำตอบของคุณ ขอโทษ
ErikE

1
@MitchWheat A SELECTการอ่านเฉพาะจากดัชนีที่ครอบคลุมอาจทำให้เกิดการชะงักงัน SPID 1) เริ่มต้นSELECTจากดัชนีครอบคลุม SPID 2) เริ่มต้นUPDATEตาราง อัปเดตจากนั้นย้ายไปสู่การอัปเดตดัชนีที่ครอบคลุม UPDATEถึงช่วงดัชนีที่ถูกล็อคSELECTและถูกบล็อก SPID 1) ยังคงค้นหาผ่านดัชนีครอบคลุมพบช่วงที่ถูกล็อคUPDATEและถูกบล็อก การหยุดชะงัก ไม่มีสิ่งใดสามารถแก้ปัญหาการชะงักงันนั้นได้ (ยกเว้นการจับข้อผิดพลาดของ SQL Server 1205 และลองใหม่โดยอัตโนมัติหรือใช้NOLOCK)
Ian Boyd

2
ฉันคิดว่าสิ่งสำคัญที่ควรทราบเกี่ยวกับคำตอบนี้คือเหมาะสมกับปัญหาที่เกิดขึ้น ขึ้นอยู่กับการใช้งานของคุณความเสี่ยงของข้อมูลที่ค้าง / ไม่ถูกผูกมัด / ซ้ำ / หายไปอาจไม่คุ้มกับการแลกเปลี่ยน
Holistic Developer

20

หากคุณไม่สนใจเกี่ยวกับการอ่านที่สกปรก (เช่นในสถานการณ์การอ่านส่วนใหญ่) ก็NOLOCKไม่เป็นไร

แต่โปรดทราบว่าปัญหาส่วนใหญ่ในการล็อกเกิดจากการไม่มีดัชนี 'ที่ถูกต้อง' สำหรับปริมาณงานสืบค้นของคุณ (สมมติว่าฮาร์ดแวร์ขึ้นอยู่กับงาน)

และคำอธิบายของกูรูก็ถูกต้อง โดยปกติจะเป็นวิธีแก้ปัญหาที่ร้ายแรงกว่า

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


3
อืม.. ยังไม่เข้าใจค่ะ ไม่เป็นไร แต่ก็ฟอร์มแย่เหมือนกัน .. นั่นคือสิ่งที่คุณกำลังพูดอยู่หรือเปล่า
Pure.Krome

บนสมมติฐานที่ว่าคุณไม่เคยสนใจเรื่องสกปรกอ่านแล้วมันจะไม่เจ็บ แต่มักจะเป็นกรณีของการรักษาอาการไม่ใช่สาเหตุ ...
มิทช์วีท

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

หน้าว่างที่คุณจะได้รับเมื่อแบบสอบถามสร้างข้อยกเว้นซึ่งคุณไม่ได้ใช้ตรรกะการลองใหม่ เกิดอะไรขึ้นในไซต์ของคุณเมื่อผลการดำเนินการค้นหามีข้อยกเว้นคุณลองตรรกะใหม่ทุกที่หรือไม่
Sam Saffron

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

13

สงสัยเป็น "กูรู" ที่เคยมีประสบการณ์ในการเข้าชมสูง ...

เว็บไซต์มักจะ "สกปรก" เมื่อบุคคลนั้นดูหน้าที่โหลดจนหมด พิจารณาแบบฟอร์มที่โหลดจากฐานข้อมูลแล้วบันทึกข้อมูลที่แก้ไข ?? เป็นเรื่องงี่เง่าที่ผู้คนพูดถึงเรื่องสกปรกว่าเป็นเรื่องที่ไม่น่าสนใจ

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

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

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

แก้ไข:ไม่ใช่แค่การชะงักงันเท่านั้น แต่ยังช่วยให้คุณต้องรอจนกว่าคุณจะทำเสร็จหรือในทางกลับกัน

ใช้ NOLOCK Hint ใน EF4 หรือไม่


10

ไม่มีคำตอบใดผิด แต่อาจจะสับสนเล็กน้อย

  • เมื่อค้นหาค่า / แถวเดียวการใช้ NOLOCK นั้นไม่ดีเสมอไป - คุณอาจไม่ต้องการแสดงข้อมูลที่ไม่ถูกต้องหรือแม้แต่ดำเนินการใด ๆ กับข้อมูลที่ไม่ถูกต้อง
  • เมื่อแสดงข้อมูลทางสถิติคร่าวๆ NOLOCK จะมีประโยชน์มาก ใช้เวลาเป็นตัวอย่าง: มันจะเป็นเรื่องไร้สาระที่จะใช้ล็อคเพื่ออ่านแน่นอนจำนวนการเข้าชมของคำถามหรือจำนวนที่แน่นอนของคำถามสำหรับแท็ก ไม่มีใครสนใจหากคุณระบุ 3360 คำถามที่ติดแท็ก "sql-server" ไม่ถูกต้องในตอนนี้และเนื่องจากการย้อนกลับธุรกรรม 3359 จะถามในหนึ่งวินาทีต่อมา

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

1
ไม่มันไม่ใช่. แถวอาจเปลี่ยนไปเนื่องจากสาเหตุอื่น ๆ เช่นการแทรกแถวอื่นจะทำให้หน้าแตก การจัดทำดัชนีที่เหมาะสมอ่าน Committed Snapshot และการแยก Snapshot เป็นแนวคิดที่ดีกว่าเกือบทุกครั้ง
Mark Sowul

1
@tuseau ถ้าคุณ "รู้" ว่าไม่มีกระบวนการอื่นใดที่จะเข้าถึงแถวการล็อกจะไม่ปิดกั้นสิ่งใดดังนั้นคุณจึงไม่มีค่าใช้จ่ายใด ๆ (ในทางปฏิบัติ)
Andrew Hill

2

ในฐานะนักพัฒนามืออาชีพฉันว่ามันขึ้นอยู่กับ แต่ฉันทำตามคำแนะนำของ GATS และ OMG Ponies แน่นอน รู้ว่าคุณกำลังทำอะไรรู้ว่าเมื่อใดที่ช่วยได้และเมื่อใดที่เจ็บและ

อ่านคำแนะนำและความคิดที่ไม่ดีอื่น ๆ

สิ่งที่อาจทำให้คุณเข้าใจเซิร์ฟเวอร์ sql ได้ลึกขึ้น โดยทั่วไปฉันปฏิบัติตามกฎที่ว่าคำแนะนำ SQL เป็นสิ่งชั่วร้าย แต่น่าเสียดายที่ฉันใช้มันทุก ๆ ครั้งเมื่อฉันเบื่อหน่ายกับการบังคับให้เซิร์ฟเวอร์ SQL ทำสิ่งต่างๆ ... แต่นี่เป็นกรณีที่หายาก

ลุค


2

เมื่อฝ่ายสนับสนุนแอปต้องการตอบคำถามเฉพาะกิจจากเซิร์ฟเวอร์ที่ใช้งานจริงโดยใช้ SSMS (ซึ่งไม่ได้รองรับผ่านการรายงาน) ฉันขอให้พวกเขาใช้ nolock วิธีนี้จะไม่ได้รับผลกระทบต่อธุรกิจ 'หลัก'


2

ฉันเห็นด้วยกับความคิดเห็นบางอย่างเกี่ยวกับคำใบ้ NOLOCK และโดยเฉพาะอย่างยิ่งกับผู้ที่พูดว่า "ใช้ตามความเหมาะสม" หากแอปพลิเคชันเขียนไม่ดีและใช้วิธีที่ไม่เหมาะสมพร้อมกันนั่นอาจทำให้เกิดการเลื่อนระดับการล็อก ตารางการทำธุรกรรมสูงยังถูกล็อคตลอดเวลาเนื่องจากลักษณะของมัน การมีดัชนีครอบคลุมที่ดีจะไม่ช่วยในการดึงข้อมูล แต่การตั้งค่า ISOLATION LEVEL เป็น READ UNCOMMITTED ทำได้ นอกจากนี้ฉันเชื่อว่าการใช้คำใบ้ NOLOCK นั้นปลอดภัยในหลาย ๆ กรณีเมื่อสามารถคาดเดาลักษณะของการเปลี่ยนแปลงได้ ตัวอย่างเช่นในการผลิตเมื่องานกับนักเดินทางต้องผ่านกระบวนการที่แตกต่างกันโดยมีการวัดเม็ดมีดจำนวนมากคุณสามารถดำเนินการสืบค้นเทียบกับงานที่เสร็จแล้วได้อย่างปลอดภัยด้วยคำใบ้ NOLOCK และวิธีนี้จะหลีกเลี่ยงการปะทะกับเซสชันอื่น ๆ ที่มีการล็อกแบบ PROMOTED หรือ EXCLUSIVE ไว้บนโต๊ะ /หน้า. ข้อมูลที่คุณเข้าถึงในกรณีนี้เป็นแบบคงที่ แต่อาจอยู่ในตารางธุรกรรมที่มีบันทึกหลายร้อยล้านรายการและการอัปเดต / แทรกหลายพันรายการต่อนาที ไชโย


2

ฉันเชื่อว่าการใช้โนล็อคนั้นไม่ถูกต้อง

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

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

NOLOCK เป็นแท็กตัวแทนสำหรับ "ฉันไม่สนใจว่าคำตอบนี้มีแถวที่ซ้ำกันแถวที่ถูกลบหรือแถวที่ไม่เคยแทรกมาก่อนเนื่องจากการย้อนกลับ"

ข้อผิดพลาดที่เป็นไปได้ภายใต้ NOLOCK:

  • แถวที่ตรงกันจะไม่ส่งคืนเลย
  • แถวเดียวจะถูกส่งกลับหลายครั้ง (รวมถึงหลายอินสแตนซ์ของคีย์หลักเดียวกัน)
  • แถวที่ไม่ตรงกันจะส่งคืน

การดำเนินการใด ๆ ที่อาจทำให้หน้าถูกแยกในขณะที่การเลือก noLock กำลังทำงานอยู่อาจทำให้เกิดสิ่งเหล่านี้ขึ้น การดำเนินการเกือบทุกอย่าง (แม้กระทั่งการลบ) อาจทำให้เกิดการแยกหน้า

ดังนั้น: หากคุณ "รู้" ว่าแถวนั้นจะไม่ถูกเปลี่ยนแปลงในขณะที่คุณกำลังทำงานอยู่อย่าใช้ nolock เนื่องจากดัชนีจะช่วยให้สามารถดึงข้อมูลได้อย่างมีประสิทธิภาพ

หากคุณสงสัยว่าแถวสามารถเปลี่ยนแปลงได้ในขณะที่กำลังรันและคุณสนใจเรื่องความถูกต้องอย่าใช้ nolock

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


2

วิธีแก้ปัญหาที่ดีกว่าเมื่อเป็นไปได้คือ:

  • จำลองข้อมูลของคุณ (โดยใช้การจำลองแบบบันทึก) ไปยังฐานข้อมูลการรายงาน
  • ใช้สแน็ปช็อต SAN และติดตั้ง DB เวอร์ชันที่สอดคล้องกัน
  • ใช้ฐานข้อมูลที่มีระดับการแยกธุรกรรมพื้นฐานที่ดีกว่า

ระดับการแยกธุรกรรม SNAPSHOT ถูกสร้างขึ้นเนื่องจาก MS กำลังสูญเสียยอดขายให้กับ Oracle Oracle ใช้บันทึกการเลิกทำ / ทำซ้ำเพื่อหลีกเลี่ยงปัญหานี้ Postgres ใช้ MVCC ในอนาคต Heckaton ของ MS จะใช้ MVCC แต่นั่นก็เป็นเวลาหลายปีกว่าที่จะพร้อมผลิต


มีการพิมพ์ผิดด้านบน ฉันหมายถึงพูดว่า "กลไกการแยกธุรกรรมพื้นฐานที่ดีกว่า"
pwy

1
ระดับการแยกธุรกรรม SNAPSHOT เป็นสิ่งประดิษฐ์ของ MS โดยทั่วไปจะวางข้อมูลในตารางชั่วคราวใน TEMPDB DB นั้นถูกแชร์ระหว่าง DB ทั้งหมดบนกล่อง ดังนั้นคุณจะต้องใช้ SSD สำหรับ TEMPDB เมื่อเป็นไปได้ นั่นอาจใช้ความพยายามน้อยกว่าตัวเลือกอื่น ๆ
pwy

1

NOLOCK มักถูกใช้เป็นวิธีวิเศษในการเร่งความเร็วการอ่านฐานข้อมูล แต่ฉันพยายามหลีกเลี่ยงการใช้มันในทุกที่ที่เป็นไปได้

ชุดผลลัพธ์สามารถมีแถวที่ยังไม่ได้รับการคอมมิตซึ่งมักจะย้อนกลับในภายหลัง

ข้อผิดพลาดหรือชุดผลลัพธ์อาจว่างเปล่าไม่มีแถวหรือแสดงแถวเดียวกันหลายครั้ง

เนื่องจากธุรกรรมอื่น ๆ กำลังย้ายข้อมูลในเวลาเดียวกันที่คุณกำลังอ่านอยู่

READ COMMITTED เพิ่มปัญหาเพิ่มเติมที่ข้อมูลเสียหายภายในคอลัมน์เดียวซึ่งผู้ใช้หลายคนเปลี่ยนเซลล์เดียวกันพร้อมกัน


-2

ในชีวิตจริงที่คุณพบกับระบบที่เขียนและเพิ่มดัชนีลงในตารางแล้วทำให้การโหลดข้อมูลของตารางข้อมูล 14gig ช้าลงอย่างมากบางครั้งคุณถูกบังคับให้ใช้กับ NOLOCK ในรายงานของคุณและการประมวลผลสิ้นเดือนเพื่อให้การรวม funtions (sum , นับ ฯลฯ ) อย่าทำแถวหน้าล็อกตารางและขัดขวางประสิทธิภาพโดยรวม พูดง่ายๆในระบบใหม่ไม่เคยใช้กับ NOLOCK และใช้ดัชนี - แต่การเพิ่มดัชนีลดระดับการโหลดข้อมูลอย่างรุนแรงและเมื่อฉันบอกว่าให้เปลี่ยนฐานรหัสเพื่อลบดัชนีจากนั้นโหลดจำนวนมากจากนั้นสร้างดัชนีใหม่ - ซึ่ง เป็นสิ่งที่ดีและดีหากคุณกำลังพัฒนาระบบใหม่ แต่ไม่ใช่เมื่อคุณมีระบบอยู่แล้ว


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