รอ WRITELOG สูงบนฐานข้อมูล Azure SQL

Aug 18 2020

การวิเคราะห์ WaitStats ของฉันของฐานข้อมูล Azure SQL ของเราแสดง WRITELOG และ HADR_SYNC_COMMIT เพื่อตอบโต้การรอสูงสุด นี่คือทรัพยากร Premium 250 eDTU

สคริปต์

SELECT   TOP (10) wait_type,
                  CAST (([wait_time_ms] / 1000.0) AS DECIMAL (16, 2)) AS [WaitS],
                  CAST (100.0 * [wait_time_ms] / SUM([wait_time_ms]) OVER () AS DECIMAL (16, 2)) AS [Percentage]
FROM     sys.dm_db_wait_stats
ORDER BY [Percentage] DESC;

ฉันไม่พบข้อมูลเกี่ยวกับวิธีจัดการกับสิ่งนี้ในฐานข้อมูล AZure SQL

ขอความช่วยเหลือใด ๆ

ขอบคุณ

คำตอบ

3 DavidBrowne-Microsoft Aug 18 2020 at 02:56

WRITELOG กำลังรอการคอมมิตเพื่อให้บันทึกการทำธุรกรรมของคุณถูกทำให้แข็งเป็นดิสก์และ HADR_SYNC_COMMIT กำลังรอการคอมมิตเพื่อให้บันทึกการทำธุรกรรมของคุณถูกส่งผ่านเครือข่ายไปยังแบบจำลองสำรองและทำให้แข็งลงในดิสก์ ดังนั้นพวกเขาจึงรอคล้ายกันมาก

ทั้งสองอย่างบ่งชี้ว่าแอปพลิเคชันของคุณทำธุรกรรมจำนวนมากซึ่งอาจมากเกินไป
และในไฟล์บันทึกระดับพรีเมียมของคุณอยู่ในแฟลชไดรฟ์ในเครื่องที่มีเวลาแฝงต่ำมากดังนั้นการรอคอย WRITELOG จำนวนมากแนะนำว่ามีบางอย่างที่ต้องแก้ไขในแอปพลิเคชันของคุณ

หากคุณมีกระบวนการใด ๆ ที่เรียกใช้ INSERT, UPDATE หรือ DELETE ของแถวเดี่ยวในการวนซ้ำที่รัดกุมให้พิจารณาการรวมเข้าด้วยกันในธุรกรรมที่ชัดเจนดังนั้นคุณต้องรอให้บันทึกธุรกรรมถูกล้างในตอนท้ายเท่านั้น

เช่นเคยQuery Storeเป็นเพื่อนของคุณและสามารถแสดงการรอด้วยข้อความค้นหาและคุณสามารถวิเคราะห์การรอตามเซสชันได้เช่นกันในsys.dm_exec_session_wait_statsเพื่อดูว่าส่วนใดของภาระงานของคุณกำลังประสบกับการรอเหล่านี้

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

select s.session_id, 
       w.wait_type, 
       w.wait_time_ms, 
       w.signal_wait_time_ms, 
       s.total_elapsed_time, 
       s.cpu_time, 
       w.wait_time_ms/cast(nullif(s.total_elapsed_time,0) as float) wait_percent_of_elapsed
from  sys.dm_exec_sessions s
join sys.dm_exec_session_wait_stats w
  on s.session_id = w.session_id
where w.wait_time_ms > 0
order by wait_percent_of_elapsed desc