ฉันเดาคำถามจริงคือ:
หากฉันไม่สนใจเกี่ยวกับการอ่านที่สกปรกจะเพิ่มคำแนะนำด้วย (NOLOCK) ในคำสั่ง SELECT ที่มีผลต่อประสิทธิภาพของ:
- คำสั่ง SELECT ปัจจุบัน
- การทำธุรกรรมอื่น ๆ กับตารางที่กำหนด
ตัวอย่าง:
Select *
from aTable with (NOLOCK)
ฉันเดาคำถามจริงคือ:
หากฉันไม่สนใจเกี่ยวกับการอ่านที่สกปรกจะเพิ่มคำแนะนำด้วย (NOLOCK) ในคำสั่ง SELECT ที่มีผลต่อประสิทธิภาพของ:
ตัวอย่าง:
Select *
from aTable with (NOLOCK)
คำตอบ:
1) ใช่การเลือกด้วยNOLOCK
จะเสร็จสมบูรณ์เร็วกว่าการเลือกปกติ
2) ใช่ตัวเลือกที่มีNOLOCK
จะช่วยให้แบบสอบถามอื่น ๆ กับตารางที่ได้รับผลกระทบดำเนินการให้เร็วกว่าตัวเลือกปกติ
ทำไมถึงเป็นเช่นนี้?
NOLOCK
โดยทั่วไปแล้ว (ขึ้นอยู่กับเอ็นจิ้น DB ของคุณ) หมายถึงให้ข้อมูลของคุณแก่ฉันและฉันไม่สนใจว่าจะมีสถานะเป็นอย่างไร ทุกอย่างเร็วขึ้นใช้ทรัพยากรน้อยลงและอันตรายมาก
คุณควรได้รับคำเตือนว่าอย่าทำการอัพเดทหรือทำสิ่งใดก็ตามที่สำคัญกับระบบหรือในกรณีที่จำเป็นต้องใช้ความถูกต้องโดยใช้ข้อมูลที่มาจากการNOLOCK
อ่าน เป็นไปได้อย่างยิ่งว่าข้อมูลนี้มีแถวที่ถูกลบระหว่างการเรียกใช้แบบสอบถามหรือที่ถูกลบไปในเซสชันอื่นที่ยังไม่สิ้นสุด เป็นไปได้ว่าข้อมูลนี้มีแถวที่ได้รับการปรับปรุงบางส่วน เป็นไปได้ว่าข้อมูลนี้มีบันทึกที่ละเมิดข้อ จำกัด กุญแจต่างประเทศ เป็นไปได้ว่าข้อมูลนี้ไม่รวมแถวที่เพิ่มลงในตาราง แต่ยังไม่ได้ยืนยัน
คุณไม่มีทางรู้ว่าสถานะของข้อมูลคืออะไร
หากคุณกำลังพยายามที่จะได้รับสิ่งต่าง ๆ เช่นจำนวนแถวหรือข้อมูลสรุปอื่น ๆ ที่ยอมรับข้อผิดพลาดบางส่วนNOLOCK
เป็นวิธีที่ดีในการเพิ่มประสิทธิภาพสำหรับการค้นหาเหล่านี้และหลีกเลี่ยงการส่งผลกระทบเชิงลบต่อประสิทธิภาพของฐานข้อมูล
ใช้NOLOCK
คำใบ้ด้วยความระมัดระวังอย่างยิ่งและรักษาข้อมูลใด ๆ ที่ส่งคืนอย่างน่าสงสัย
NOLOCK ทำให้คำสั่ง SELECT ส่วนใหญ่เร็วขึ้นเนื่องจากไม่มีการล็อกที่ใช้ร่วมกัน นอกจากนี้การไม่มีการออกล็อคหมายความว่าผู้เขียนจะไม่ถูกขัดขวางจากการเลือกของคุณ
NOLOCK นั้นเทียบเท่ากับระดับการแยกของ READ UNCOMMITTED ความแตกต่างที่สำคัญคือคุณสามารถใช้ NOLOCK ในบางตาราง แต่ไม่ใช่อื่น ๆ หากคุณเลือก หากคุณวางแผนที่จะใช้ NOLOCK ในตารางทั้งหมดในแบบสอบถามที่ซับซ้อนแล้วการใช้ SET TRANSACTION ISOLATION LEOL ระดับการอ่าน UNCOMMITTED นั้นง่ายกว่าเพราะคุณไม่ต้องใช้คำใบ้กับทุกตาราง
นี่คือข้อมูลเกี่ยวกับระดับการแยกทั้งหมดในการกำจัดของคุณเช่นเดียวกับคำแนะนำตาราง
นอกเหนือจากที่กล่าวไว้ข้างต้นคุณควรระวังเป็นอย่างยิ่งที่ nolock กำหนดความเสี่ยงของคุณที่จะไม่ได้รับแถวที่ได้รับมอบหมายก่อนที่คุณจะเลือก
มันจะเร็วขึ้นเพราะไม่ต้องรอการล็อค
คำตอบคือใช่ถ้ามีการเรียกใช้แบบสอบถามหลายครั้งพร้อมกันเนื่องจากแต่ละธุรกรรมไม่จำเป็นต้องรอให้รายการอื่นดำเนินการจนเสร็จ อย่างไรก็ตามหากแบบสอบถามถูกเรียกใช้เพียงครั้งเดียวคำตอบคือไม่
ใช่แล้ว มีความน่าจะเป็นอย่างมากที่การใช้ WITH (NOLOCK) อย่างระมัดระวังจะทำให้ฐานข้อมูลของคุณเร็วขึ้น หมายความว่าธุรกรรมอื่น ๆ ไม่จำเป็นต้องรอให้คำสั่ง SELECT นี้ดำเนินการจนเสร็จสิ้น แต่ในทางกลับกันธุรกรรมอื่น ๆ จะช้าลงเนื่องจากพวกเขากำลังแบ่งปันเวลาในการประมวลผลกับธุรกรรมใหม่
ระวังให้ใช้เฉพาะWITH (NOLOCK)
ในคำสั่ง SELECT บนตารางที่มีดัชนีคลัสเตอร์
ด้วย (NOLOCK) มักถูกใช้เป็นวิธีที่วิเศษในการเพิ่มความเร็วในการอ่านธุรกรรม
ชุดผลลัพธ์สามารถมีแถวที่ยังไม่ได้ส่งซึ่งมักจะย้อนกลับในภายหลัง
หาก WITH (NOLOCK) ถูกนำไปใช้กับตารางที่มีดัชนีที่ไม่ใช่คลัสเตอร์ดังนั้นดัชนีแถวสามารถเปลี่ยนแปลงได้โดยธุรกรรมอื่น ๆ เนื่องจากข้อมูลแถวกำลังถูกสตรีมเข้าสู่ตารางผลลัพธ์ ซึ่งหมายความว่าชุดผลลัพธ์อาจหายไปแถวหรือแสดงแถวเดียวกันหลายครั้ง
READ COMMITTED เพิ่มปัญหาเพิ่มเติมที่ข้อมูลเสียหายภายในคอลัมน์เดียวที่ผู้ใช้หลายคนเปลี่ยนเซลล์เดียวกันพร้อมกัน