KB2926217 - แก้ไข: ปัญหาด้านประสิทธิภาพเกิดขึ้นเมื่อกิจกรรมการล็อกฐานข้อมูลเพิ่มขึ้นใน SQL Server

นำไปใช้กับ
SQL Server 2012 Enterprise SQL Server 2012 Developer SQL Server 2012 Standard SQL Server 2012 Express SQL Server 2012 Web SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2008 Service Pack 3 SQL Server 2008 Developer SQL Server 2008 Enterprise SQL Server 2008 Standard SQL Server 2008 R2 Service Pack 2 SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard

ตามค่าเริ่มต้น Service Pack 1 สําหรับ SQL Server 2014 และ Service Pack 3 สําหรับ SQL Server 2012 จะมีการแก้ไขนี้และคุณไม่จําเป็นต้องเพิ่มการตั้งค่าสถานะการติดตามใดๆ เพื่อเปิดใช้งานการแก้ไข เมื่อต้องการเปิดใช้งานการแก้ไขหลังจากที่คุณติดตั้งหนึ่งในการอัปเดตสะสมในส่วนการแก้ปัญหา คุณต้องเริ่มต้น Microsoft SQL Server โดยการเพิ่มแฟล็กการติดตาม 1236 ลงในพารามิเตอร์เริ่มต้น

อาการ

สมมติว่า คุณเรียกใช้อินสแตนซ์ของ Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 หรือ SQL Server 2008 R2 บนคอมพิวเตอร์ที่มีตัวประมวลผลจํานวนมาก เมื่อจํานวนการล็อก (ชนิดทรัพยากร = DATABASE) สําหรับฐานข้อมูลที่ระบุเกินเกณฑ์ที่กําหนด คุณจะพบปัญหาด้านประสิทธิภาพต่อไปนี้:

  • ค่าที่สูงขึ้นจะเกิดขึ้นสําหรับจํานวน LOCK_HASH สปินล็อค

    หมายเหตุ ดูส่วน "ข้อมูลเพิ่มเติม" สําหรับข้อมูลเกี่ยวกับวิธีตรวจสอบสปินล็อคนี้

  • คิวรีหรือการดําเนินการที่จําเป็นต้องล็อกฐานข้อมูลใช้เวลานานในการทําให้เสร็จสมบูรณ์ ตัวอย่างเช่น คุณอาจสังเกตเห็นความล่าช้าของประสิทธิภาพการทํางานต่อไปนี้:

    • การเข้าสู่ระบบ SQL Server
    • คิวรีเซิร์ฟเวอร์ที่ลิงก์
    • sp_reset_connection
    • ธุรกรรม

หมายเหตุ เมื่อต้องการระบุตําแหน่งรายการล็อก (ชนิดทรัพยากร = DATABASE) บนฐานข้อมูลที่ระบุ ให้ดูที่ส่วน "ข้อมูลเพิ่มเติม" ค่าที่ใช้เป็นตัวเทียบจะแตกต่างกันไปตามสภาพแวดล้อม

การแก้ปัญหา

ข้อมูลการอัปเดตสะสม

ปัญหานี้ได้รับการแก้ไขครั้งแรกในการอัปเดตแบบสะสมของ SQL Server ต่อไปนี้

การอัปเดตสะสม 13 สําหรับ SQL Server 2008 R2 SP2 /en-us/help/2967540

การอัปเดตสะสม 17 สําหรับ SQL Server 2008 SP3 /en-us/help/2958696

การอัปเดตสะสม 1 สําหรับ SQL Server 2014 /en-us/help/2931693

การอัปเดตสะสม 9 สําหรับ SQL Server 2012 SP1 /en-us/help/2931078

เกี่ยวกับการอัปเดตสะสมสําหรับ SQL Server

การอัปเดตแบบสะสมใหม่แต่ละรายการสําหรับ SQL Server จะมีโปรแกรมแก้ไขด่วนและการแก้ไขข้อบกพร่องด้านความปลอดภัยทั้งหมดที่รวมอยู่ในการอัปเดตแบบสะสมครั้งก่อนหน้า ตรวจดูการอัปเดตแบบสะสมล่าสุดสําหรับ SQL Server:

      

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

หากโปรแกรมแก้ไขด่วนพร้อมให้ดาวน์โหลด จะมีส่วน "การดาวน์โหลดโปรแกรมแก้ไขด่วนพร้อมใช้งาน" ที่ด้านบนของบทความฐานความรู้นี้ หากส่วนนี้ไม่ปรากฏ ให้ส่งคําขอไปยังฝ่ายสนับสนุนและบริการลูกค้าของ Microsoft เพื่อรับโปรแกรมแก้ไขด่วน

หมายเหตุ ถ้าเกิดปัญหาเพิ่มเติมหรือจําเป็นต้องมีการแก้ไขปัญหาใดๆ คุณอาจต้องสร้างคําขอรับบริการแยกต่างหาก ค่าใช้จ่ายการสนับสนุนตามปกติจะนําไปใช้กับคําถามและปัญหาการสนับสนุนเพิ่มเติมที่ไม่เข้าเกณฑ์สําหรับโปรแกรมแก้ไขด่วนเฉพาะนี้ สําหรับรายการทั้งหมดของหมายเลขโทรศัพท์ฝ่ายบริการและการสนับสนุนลูกค้าของ Microsoft หรือสร้างคําขอบริการแยกต่างหาก โปรดเยี่ยมชมเว็บไซต์ของ Microsoft ต่อไปนี้:

/contactus/?ws=support หมายเหตุ: แบบฟอร์ม "โปรแกรมแก้ไขด่วนพร้อมใช้งาน" จะแสดงภาษาสําหรับโปรแกรมแก้ไขด่วนที่พร้อมใช้งาน หากคุณไม่เห็นภาษาของคุณ นั่นเป็นเพราะโปรแกรมแก้ไขด่วนไม่พร้อมใช้งานในภาษานั้น

สถานะ

Microsoft ได้ยืนยันว่านี่เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ที่แสดงไว้ในส่วน "นำไปใช้กับ"

ข้อมูลเพิ่มเติม

เมื่อแอปพลิเคชันทําการเชื่อมต่อกับ SQL Server แอปพลิเคชันจะสร้างบริบทฐานข้อมูลขึ้นก่อน ตามค่าเริ่มต้น การเชื่อมต่อจะพยายามรับการล็อกฐานข้อมูลในโหมด SH การล็อก SH-DATABASE จะถูกปลดปล่อยเมื่อการเชื่อมต่อถูกหยุดลง หรือบริบทของฐานข้อมูลมีการเปลี่ยนแปลงในระหว่างอายุการใช้งานของการเชื่อมต่อ ถ้าคุณมีการเชื่อมต่อที่ใช้งานอยู่จํานวนมากที่ใช้บริบทฐานข้อมูลเดียวกัน คุณสามารถล็อกชนิดทรัพยากร DATABASE จํานวนมากสําหรับฐานข้อมูลนั้นได้

บนคอมพิวเตอร์ที่มี CPU 16 ตัวหรือมากกว่า เฉพาะวัตถุตารางเท่านั้นที่ใช้แบบแผนการล็อกแบบแบ่งพาร์ติชัน อย่างไรก็ตาม ล็อกฐานข้อมูลจะไม่ถูกแบ่งพาร์ติชัน ดังนั้น ยิ่งจํานวนการล็อกฐานข้อมูลมีมากขึ้นเท่าใด SQL Server ก็จะยิ่งใช้เวลานานขึ้นในการรับการล็อกในฐานข้อมูล แอปพลิเคชันส่วนใหญ่ไม่พบปัญหาใดๆ ที่เกิดจากการออกแบบนี้ แต่ทันทีที่ตัวเลขเกินเกณฑ์ที่กําหนดจําเป็นต้องทํางานและเวลาเพิ่มเติมเพื่อรับการล็อค แม้ว่าค่าใช้จ่ายจะอยู่ที่ไมโครวินาทีเท่านั้นสําหรับการล็อกเพิ่มเติมแต่ละครั้ง แต่เวลาทั้งหมดอาจเพิ่มขึ้นอย่างรวดเร็วเนื่องจากบักเก็ตแฮชของล็อกได้รับการป้องกันโดยใช้สปินล็อค ซึ่งทําให้เกิดวงจร CPU เพิ่มเติมและรอให้ผู้ปฏิบัติงานเพิ่มเติมได้รับการล็อก

โปรแกรมแก้ไขด่วนนี้จะเปิดตัวการล็อกฐานข้อมูลเมื่อมีการเปิดใช้งานสถานะการติดตาม T1236 เมื่อเริ่มต้นระบบ การแบ่งพาร์ติชันล็อก DATABASE จะรักษาความลึกของรายการล็อกที่สามารถจัดการได้ในแต่ละพาร์ติชันภายในเครื่อง ซึ่งจะปรับเส้นทางการเข้าถึงที่ใช้ในการรับการล็อกฐานข้อมูลได้อย่างมีประสิทธิภาพอย่างมาก

เมื่อต้องการตรวจสอบ Spinlock ของ LOCK_HASH คุณสามารถใช้คิวรีต่อไปนี้ ตั้งค่า NOCOUNT ON
CREATE TABLE #spinlock_stats([CaptureTime] datetime,[name] nvarchar(512),[collisions] bigint,
[Spins] BigInt,[spins_per_collision] Real,[sleep_time] BigInt,[Backoffs] Int)
DECLARE @counter int = 1
ขณะที่ @counter< 100
      BEGIN
            INSERT INTO #spinlock_stats SELECT GETDATE() as "CaptureTime" , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
            WAITFOR DELAY '00:00:05'
            SET @counter +=1
      END
SELECT * FROM #spinlock_stats ORDER BY [CaptureTime]
ตารางหล่น #spinlock_stats สําหรับข้อมูลเพิ่มเติมเกี่ยวกับการวินิจฉัยและการแก้ไขความขัดแย้งของ Spinlock บน SQL Server ให้ไปที่เอกสารต่อไปนี้:

การวินิจฉัยและการแก้ไขการขัดแย้งของ Spinlock บน SQL Server หมายเหตุ แม้ว่าเอกสารนี้จะถูกเขียนขึ้นสําหรับ SQL Server 2008 R2 แต่ข้อมูลนี้ยังคงใช้ได้กับ SQL Server 2012

การอ้างอิง

สําหรับข้อมูลเพิ่มเติมเกี่ยวกับการติดตามสถานะใน SQL Server 2012 ให้ไปที่เว็บไซต์ TechNet ต่อไปนี้:

ข้อมูลเกี่ยวกับการติดตามการตั้งค่าสถานะใน SQL Server 2012
สําหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการค้นหาจํานวนการล็อกฐานข้อมูลของผู้ใช้ต่อฐานข้อมูล ให้ใช้คิวรีต่อไปนี้เพื่อคํานวณค่านี้:select Resource_database_id, resource_type, request_mode, request_status,
count (*) 'LockCount' from sys.dm_tran_locks
จัดกลุ่มตาม Resource_database_id, resource_type, request_mode request_status