อาการ
เมื่อคุณใช้ฟังก์ชัน SCOPE_IDENTITY()หรือ @@IDENTITYเพื่อรับค่าที่แทรกลงในคอลัมน์ข้อมูลเฉพาะตัว คุณอาจสังเกตเห็นว่าในบางครั้งฟังก์ชันเหล่านี้จะส่งกลับค่าที่ไม่ถูกต้อง ปัญหาจะเกิดขึ้นเมื่อคิวรีของคุณใช้แผนปฏิบัติการแบบขนานเท่านั้น For more information on how to determine if your queries are going to use parallel execution plans refer to the Intra-query parallelism section in the following technical article on Microsoft Downloads:
สาเหตุ
Microsoft ได้ยืนยันว่าปัญหานี้เป็นปัญหาในผลิตภัณฑ์ของ Microsoft ที่แสดงอยู่ในตอนต้นของบทความนี้
การแก้ไข
ข้อมูลโปรแกรมอัปเดตสะสม
SQL Server 2008 R2 Service Pack 1
การแก้ไขของปัญหานี้ถูกปล่อยครั้งแรกในการอัปเดตสะสม 5 for SQL Server 2008 R2 Service Pack 1 For more information about how to obtain this cumulative update package, click the following article number to view the article in the Microsoft Knowledge Base:
2659694แพคเกจการอัปเดตสะสม 5 ของ SQL Server 2008 R2 Service Pack 1
หมายเหตุ เนื่องจากบิลด์เป็นแบบสะสม การแก้ไขใหม่แต่ละรุ่นจะมีการแก้ไขด่วนทั้งหมดและการแก้ไขด้านความปลอดภัยทั้งหมดที่รวมอยู่ในรุ่นแก้ไขของ SQL Server 2008 R2 ก่อนหน้า เราขอแนะนนะให้คุณพิจารณาใช้การแก้ไขล่าสุดที่มีการแก้ไขด่วนนี้ สำหรับข้อมูลเพิ่มเติม โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base:
2567616รุ่น SQL Server 2008 R2 ที่เผยแพร่หลังจากเปิดตัว SQL Server 2008 R2 Service Pack 1 แล้ว
วิธีแก้ไขปัญหาชั่วคราว
Microsoft ขอแนะให้คุณไม่ใช้ฟังก์ชันใดฟังก์ชันหนึ่งในคิวรีของคุณเมื่อมีแผนคู่ขนานเนื่องจากแผนเหล่านี้ไม่น่าเชื่อถือเสมอไป ให้ใช้ส่วนสั่ง OUTPUT ของข้อความ INSERT เพื่อรับค่าข้อมูลเฉพาะตัวตามที่แสดงในตัวอย่างด้านล่างแทน
ตัวอย่างของการใช้ส่วนสั่ง OUTPUT:
DECLARED @MyNewIdentityValues table(myidvalues int)
ประกาศ@A (ID คีย์หลัก)
แทรก@A (1)
ประกาศ@B (ID เป็นข้อมูลเฉพาะตัวของคีย์หลัก(1,1), B int not null)
แทรก@B (1)
เลือก
[RowCount] = @@RowCount,
[@@IDENTITY] = @@IDENTITY,
[SCOPE_IDENTITY] = SCOPE_IDENTITY()
ตั้งค่าโปรไฟล์สถิติเมื่อ
แทรก_ddr_T
ผลลัพธ์ inserted.ID เป็น @MyNewIdentityValues
เลือก
b.ID
จาก @A a
การรวมด้านซ้าย@B b เมื่อวันที่ b.ID = 1
การรวมด้านซ้าย@B b2 บน b2 B = -1
การรวมด้านซ้าย_ddr_T t บน t.T = -1
เมื่อไม่มีอยู่ (เลือก * จาก _ddr_T t2 โดยที่ t2.ID = -1)
ตั้งค่าโปรไฟล์สถิติปิดอยู่
เลือก
[RowCount] = @@RowCount,
[@@IDENTITY] = @@IDENTITY,
[SCOPE_IDENTITY] = SCOPE_IDENTITY(),
[IDENT_CURRENT] = IDENT_CURRENT('_ddr_T')
เลือก * จาก @MyNewIdentityValues
ไป
ถ้าสถานการณ์ของคุณต้องการให้คุณใช้ฟังก์ชันใดฟังก์ชันหนึ่งเหล่านี้ คุณสามารถใช้หนึ่งในวิธีต่อไปนี้เพื่อแก้ไขปัญหาชั่วคราว
วิธีที่ 1:
รวมตัวเลือกต่อไปนี้ในคิวรีของคุณ
OPTION (MAXDOP 1)
หมายเหตุ: ซึ่งอาจเจ็บประสิทธิภาพการการคํานวณของส่วน SELECT ของคิวรีของคุณ
วิธีที่ 2:
อ่านค่าจากส่วน SELECT ลงในชุดของตัวแปร (หรือตัวแปรตารางเดียว) แล้วแทรกลงในตารางเป้าหมายด้วย MAXDOP=1 เนื่องจากแผน INSERT จะไม่ถูกขนานไปกับผลลัพธ์ที่ถูกต้อง แต่ SELECT ของคุณจะขนานไปกับประสิทธิภาพที่ต้องการ
วิธีที่ 3:
เรียกใช้ข้อความต่อไปนี้เพื่อตั้งค่าองศา สูงสุดของตัวเลือกแนวขนาน เป็น 1:
sp_configure 'องศาสูงสุดของแนวขนาน', 1
ไป
ตั้งค่าใหม่ด้วยการแทนที่
ไป
หมายเหตุ: วิธีนี้อาจทําให้ประสิทธิภาพการลดลงของเซิร์ฟเวอร์ คุณไม่ควรใช้วิธีการนี้นอกจากว่าคุณได้ประเมินวิธีการดังกล่าวในสภาพแวดล้อมการทดสอบหรือการจัดเตรียม