ตรวจสอบความคืบหน้าของการแก้ไขการจัดระเบียบดัชนีใหม่ / สร้างใหม่


17

ฉันจะตรวจสอบความคืบหน้า / สถานะได้อย่างไรเมื่อฉันส่งการเปลี่ยนแปลงดัชนีการจัดระเบียบใหม่ / สร้างใหม่?


1
จากความคืบหน้าคุณหมายถึงจำนวนแถวของดัชนีที่ตรวจสอบและมีจำนวนเท่าใด ฉันไม่คิดว่าคุณสามารถทำได้ ทางออกที่ดีที่สุดของคุณคือการตรวจสอบโดยใช้ DMV sys.dm_exec_requests
Shanky

คำตอบ:


16

เป็นการยากที่จะบอกว่าการสร้างใหม่ของคุณจะใช้เวลานานเท่าไหร่เนื่องจาก SQL เองไม่ทราบล่วงหน้าล่วงหน้าและไม่สามารถประมาณการได้

คุณสามารถใช้แบบสอบถามต่อไปนี้เพื่อใช้ dm_exec_requests dmv เพื่อดูว่าดัชนีการสร้างดัชนีของคุณดำเนินต่อไปอีกนานแค่ไหนและเพื่อตรวจสอบว่า SQL ไม่มีการประมาณการจริง:

SELECT r.session_id,r.command,CONVERT(NUMERIC(6,2),r.percent_complete)
AS [Percent Complete],CONVERT(VARCHAR(20),DATEADD(ms,r.estimated_completion_time,GetDate()),20) AS [ETA Completion Time],
CONVERT(NUMERIC(10,2),r.total_elapsed_time/1000.0/60.0) AS [Elapsed Min],
CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0) AS [ETA Min],
CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0/60.0) AS [ETA Hours],
CONVERT(VARCHAR(1000),(SELECT SUBSTRING(text,r.statement_start_offset/2,
CASE WHEN r.statement_end_offset = -1 THEN 1000 ELSE (r.statement_end_offset-r.statement_start_offset)/2 END)
FROM sys.dm_exec_sql_text(sql_handle)))
FROM sys.dm_exec_requests r WHERE command IN ('Alter Index')

อย่างไรก็ตามเมื่อพูดถึงการคาดการณ์ตามเวลาจริงคุณสามารถอ่านบล็อกโพสต์ที่ดีจาก sqlmunkee ซึ่งสรุปได้โดยพูดว่า ".. มันขึ้นอยู่กับ":

และเนื่องจากเราไม่ได้อยู่ในฮาร์ดแวร์เดียวกันทั้งหมดโดยใช้ซอฟต์แวร์เดียวกันหรือดูข้อมูลเดียวกันคำตอบต้องเป็น… .. ขึ้นอยู่กับ

น่าผิดหวัง แต่จริงแล้วน่าเศร้า


2
ขอบคุณสำหรับสคริปต์ที่ดีฉันต้องปรับตำแหน่งของประโยคให้เป็น 'DBCC' แต่จากนั้นฉันได้ข้อมูลกลับมาโดยบอกว่าเปอร์เซ็นต์ที่สมบูรณ์คือ 6.42 และ ETA Min อยู่ที่ประมาณ 707 (ซึ่งเป็นพาร์ติชันเดียว) ฉันจะจับตามองว่ามันจะไปได้ไกลแค่ไหน จะตรวจสอบการโพสต์เช่นกัน
nojetlag

สิ่งนี้ใช้ได้กับการสร้างออนไลน์ด้วยหรือไม่
Simon_Weaver

1
@Simon_Weaver ควรทำใช่
Reaces

ใช้งานได้กับ REORGANIZE เท่านั้น มันไม่ทำงานสำหรับการสร้างใหม่ โปรดดูคอลัมน์ "percent_complete" ที่ URL ต่อไปนี้เพื่อดูรายการที่สมบูรณ์ คอลัมน์ที่มีค่าประมาณ _completion_time อยู่ในหมวดหมู่เดียวกัน แต่ไม่มีการบันทึกไว้เช่นนี้เพราะเป็น "ภายในเท่านั้น" docs.microsoft.com/en-us/sql/relational-database/…
Jeff Moden

4

ฉันจัดการเพื่อค้นหาโพสต์บล็อกนี้ด้วยสคริปต์ magick ซึ่งถูกกล่าวหาว่าทำงานไม่สามารถตรวจสอบได้เนื่องจากดูเหมือนว่าจะไม่ทำงานสำหรับ SQL Server 2014 ที่ฉันใช้อยู่บล็อกคิวรีที่รอการล็อคที่ใช้ร่วมกัน บางทีใครบางคนอาจพบว่ามันมีประโยชน์ แต่ฉันจะทิ้งมันไว้ที่นี่

;WITH cte AS
(
SELECT
object_id,
index_id,
partition_number,
rows,
ROW_NUMBER() OVER(PARTITION BY object_id, index_id, partition_number ORDER BY partition_id) as rn
FROM sys.partitions
)
SELECT
   object_name(cur.object_id) as TableName,
   cur.index_id,
   cur.partition_number,
   PrecentDone =
      CASE
         WHEN pre.rows = 0 THEN 0
      ELSE
         ((cur.rows * 100.0) / pre.rows)
      END,
   pre.rows - cur.rows as MissingRows
FROM cte as cur
INNER JOIN cte as pre on (cur.object_id = pre.object_id) AND (cur.index_id = pre.index_id) AND (cur.partition_number = pre.partition_number) AND (cur.rn = pre.rn +1)
ORDER BY 4

1

ฉันพบคำตอบที่ยอมรับด้านบนดี แต่ขาดสิ่งสำคัญ: สถานะคำสั่ง (เช่นคำสั่งถูกบล็อก)

การเลือกอย่างง่ายนี้แสดงสถานะด้านหน้าและศูนย์กลาง:

SELECT percent_complete, *
FROM sys.dm_exec_requests
WHERE session_id = <session id of alter index>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.