อาการ
พิจารณาสถานการณ์สมมติต่อไปนี้:
-
เซิร์ฟเวอร์ที่ถูกเชื่อมโยงถูกกำหนดค่าระหว่างเซิร์ฟเวอร์ภายในเครื่องและเซิร์ฟเวอร์ระยะไกลว่า ทั้งสองมีอินสแตนซ์ของ Microsoft SQL Server 2012
-
เซิร์ฟเวอร์ภายในถูกกำหนดค่า โดยใช้การเปรียบเทียบหนึ่ง เช่นการเปรียบเทียบเทียบ
-
เซิร์ฟเวอร์ระยะไกลมีวัตถุที่มีการกำหนดค่าในการเปรียบเทียบที่แตกต่างจากเซิร์ฟเวอร์ท้องถิ่น เช่นเปรียบเทียบเทียบ
-
จะทำการเชื่อมต่อจากโปรแกรมควบคุม Microsoft JDBC สำหรับ SQL Server โปรแกรมควบคุม Microsoft ODBC SQL Server, SQL OLE DB provider หรือ SQL Native Client ไปยังเซิร์ฟเวอร์ภายในเครื่อง
-
โปรแกรมควบคุมที่ดำเนินการแบบสอบถามปรับปรุงคำสั่งกลุ่ม SQL เป็นคำสั่งที่เตรียมไว้ที่เรียกกระบวนงานเก็บไว้sp_prepexecบนเซิร์ฟเวอร์ภายใน
-
แบบสอบถามปรับปรุงตารางบนเซิร์ฟเวอร์ระยะไกล ซึ่งรวมถึงวัตถุคอลัมน์ที่ใช้การเปรียบเทียบที่แตกต่างจากเซิร์ฟเวอร์ภายในเครื่อง
ในสถานการณ์สมมตินี้ คุณอาจพบประสิทธิภาพการทำงานที่ช้าของการดำเนินการแบบสอบถาม ถ้าคุณทำเครื่องหมายแผนการดำเนินการของแบบสอบถาม update คุณอาจพบว่า มีดำเนินการสแกนแบบระยะไกลบนตารางในเซิร์ฟเวอร์ระยะไกล โดยไม่มีการกรอง ดังนั้น แบบสอบถามที่สามารถดำเนินการอ่านมากเมื่อโปรแกรมสแกนตารางระยะไกล และจากนั้น ดึงข้อมูลแถวทั้งหมดกลับไปยังเซิร์ฟเวอร์ภายในเครื่อง
ตัวอย่างเช่น แบบสอบถามเตรียมไว้บนเซิร์ฟเวอร์ภายในเครื่องที่มีการเปรียบเทียบ และเซิร์ฟเวอร์ระยะไกลมีตารางT1ที่ประกอบด้วยคอลัมน์ที่เล็ก การปรับปรุงจะสแกนแถวทั้งหมดของT1
DECLARE @p1 INTEXEC sp_prepexec @p1 output, N'@P0 NVARCHAR(16), @P1 NVARCHAR(16)',
N'UPDATE RemoteServer.RemoteDatabase.dbo.T1 SET COL1=@P0 WHERE COL2=@P1',
N'a', N'a'
SELECT @p1
สาเหตุ
ปัญหานี้เกิดขึ้นเนื่องจากแบบสอบถาม update ที่เตรียมไว้จะสแกนตารางระยะไกลเมื่อเปรียบเทียบไม่ตรงกับบนเซิร์ฟเวอร์ทั้งสอง
การแก้ปัญหา
หลังจากใช้โปรแกรมแก้ไขด่วน คุณจำเป็นต้องเปิดใช้แฟล็กการติดตาม 4199 บนเซิร์ฟเวอร์ภายในเครื่องที่เป็นโฮสต์ของเซิร์ฟเวอร์ที่ถูกเชื่อมโยง สำหรับวิธีการเปิดใช้งานการ traceflag โปรดดูที่ส่วนข้อมูลเพิ่มเติม
หมายเหตุ โปรแกรมแก้ไขด่วนนี้ใช้กับเซิร์ฟเวอร์ที่เป็นโฮสต์ของเซิร์ฟเวอร์ที่ถูกเชื่อมโยง และกำหนดการงบที่เตรียมไว้ ภายในเท่านั้น โปรแกรมแก้ไขด่วนนี้ไม่ใช้กับเซิร์ฟเวอร์ระยะไกล
ปัญหานี้ถูกถาวรแรกในการปรับปรุงสะสมต่อไปนี้ของ SQL Server
ปรับปรุงสะสม 6 สำหรับ SQL Server 2012 SP1/en-us/help/2874879
แต่ละโปรแกรมปรับปรุงสะสมใหม่สำหรับ SQL Server ประกอบด้วยโปรแกรมแก้ไขด่วนทั้งหมด และทั้งหมดที่แก้ไขความปลอดภัยที่ถูกรวมอยู่ในการปรับปรุงที่สะสมก่อนหน้านี้ ตรวจหาการปรับปรุงสะสมล่าสุดสำหรับ SQL Server:
ข้อมูลโปรแกรมแก้ไขด่วนมีโปรแกรมแก้ไขด่วนที่รองรับพร้อมให้บริการจาก Microsoft อย่างไรก็ตาม โปรแกรมแก้ไขด่วนนี้มุ่งหวังเพื่อการแก้ไขเฉพาะปัญหาที่อธิบายไว้ในบทความนี้ ใช้ hotfix นี้เฉพาะกับระบบต่าง ๆ ที่พบปัญหานี้
หากโปรแกรมแก้ไขด่วนพร้อมสำหรับการดาวน์โหลด คุณจะเห็นส่วน "มีโปรแกรมแก้ไขด่วนพร้อมสำหรับการดาวน์โหลด" ที่ด้านบนของบทความฐานข้อมูลองค์ความรู้นี้ หากส่วนนี้ไม่ปรากฏขึ้น ส่งคำขอถึงฝ่ายบริการและการสนับสนุนลูกค้าของ Microsoft และวิธีการขอรับโปรแกรมแก้ไขด่วน
หมายเหตุ ถ้ามีปัญหาอื่น ๆ เกิดขึ้น หรือถ้าจำเป็นต้องแก้ไขปัญหาใด ๆ คุณอาจต้องสร้างคำขอรับบริการแยกต่างหาก จะมีค่าใช้จ่ายในการสนับสนุนปกติกับคำถามเพิ่มเติมและเรื่องอื่น ๆ ที่ไม่มีสิทธิได้รับโปรแกรมแก้ไขด่วนเฉพาะนี้ สำหรับรายชื่อทั้งหมด ของหมายเลขโทรศัพท์ของฝ่ายบริการลูกค้าของ Microsoft และการสนับสนุน หรือ เพื่อสร้างการร้องขอบริการแยกต่างหาก แวะไปที่เว็บไซต์ของ Microsoft ต่อไปนี้:
http://support.microsoft.com/contactus/?ws=supportหมายเหตุ แบบฟอร์ม "มีโปรแกรมแก้ไขด่วนพร้อมสำหรับการดาวน์โหลด" แสดงภาษาที่โปรแกรมแก้ไขด่วนพร้อมใช้งาน ถ้าคุณไม่เห็นภาษาของคุณ อาจเป็น เพราะไม่มีโปรแกรมแก้ไขด่วนพร้อมใช้งานสำหรับภาษานั้น
ข้อกำหนดเบื้องต้นเมื่อต้องการใช้โปรแกรมแก้ไขด่วนนี้ คุณต้องมี 2012 เซิร์ฟเวอร์ SQL ที่ติดตั้งอยู่
ข้อมูลรีจิสทรีคุณไม่จำเป็นต้องเปลี่ยนแปลงรีจิสทรีหลังจากที่คุณใช้โปรแกรมแก้ไขด่วนนี้
ข้อมูลการแทนที่โปรแกรมแก้ไขด่วนโปรแกรมแก้ไขด่วนนี้ไม่ได้แทนโปรแกรมแก้ไขด่วนอื่น ๆ
สถานะ
Microsoft ยืนยันว่านี่เป็นปัญหาในผลิตภัณฑ์ของ Microsoft ซึ่งแสดงไว้ในส่วน "นำไปใช้กับ"
วิธีแก้ปัญหา
การทำงาน abound ปัญหา ใช้หนึ่งในวิธีต่อไปนี้:
-
ใช้คำสั่งที่เตรียมไว้ในรหัสแหล่งที่มาของแอพลิเคชันไคลเอนต์ คุณสามารถใช้คำสั่งกิจหรือคำสั่งที่สามารถเรียกได้เช่นกระบวนงานที่เก็บไว้แทนถ้าโปรแกรมควบคุมที่สนับสนุนอินเทอร์เฟซเหล่านั้น
-
ใช้เปรียบเทียบตรงกันบนเซิร์ฟเวอร์ทั้งสอง
ข้อมูลเพิ่มเติม
เมื่อต้องการเปิดใช้งานการสืบค้นกลับค่าสถานะ เพิ่มพารามิเตอร์เริ่มต้น-T4199หรือDBCC TRACEON(4199,-1)ก่อนที่คำสั่งเตรียมไว้ถูกคอมไพล์เพื่อเปิดใช้งานลักษณะการทำงาน
คุณสามารถใช้หนึ่งในวิธีต่อไปนี้เพื่อเปิดใช้งานการสืบค้นกลับค่าสถานะ:
-
ก่อนที่คุณเริ่มต้นเซิร์ฟเวอร์ SQL ใช้โปรแกรมจัดการการตั้งค่าคอนฟิกเซิร์ฟเวอร์ SQL Microsoft คลิกขวาที่อินสแตนซ์ที่ได้รับผลกระทบ และเพิ่มพารามิเตอร์เริ่มต้น-T4199เพื่อที่จะยังคงอยู่ ระหว่างการเริ่มระบบ และในแต่ ละการเชื่อมต่อกับอินสแตนซ์ทั้งหมดในอนาคต
-
การตั้งค่า ในขณะทำงานหลังจากที่ได้รับการเริ่มต้นบริการ และส่วนกลาง สำหรับ "(-1) การเชื่อมต่อทั้งหมดที่เปิดใช้งานแบบไดนามิก" ตรวจสอบให้แน่ใจว่าว่างถ้าคุณวางแผนที่จะทำการทดสอบกับสวิตช์เปิด หรือปิดใช้งานการแคกระบวนงาน
ใช้ต่อไปนี้เพื่อเปิดใช้งานการตั้งค่าแบบส่วนกลาง และแบบไดนามิก:
DBCC TRACEON(4199,-1)DBCC TRACESTATUS(-1)
DBCC FREEPROCCACHE
ใช้ต่อไปนี้เพื่อปิดใช้งานการตั้งค่าแบบส่วนกลาง และแบบไดนามิก:
DBCC TRACEOFF(4199,-1)DBCC TRACESTATUS(-1)
DBCC FREEPROCCACHE