SQL Server查看索引重建、重組索引進度

来源:https://www.cnblogs.com/kerrycode/archive/2019/02/25/10430929.html
-Advertisement-
Play Games

相信很多SQL Server DBA或開發人員在重建或重組大表索引時,都會相當鬱悶,不知道索引重建的進度,這個對於DBA完全是一個黑盒子,對於系統負載非常大的系統或維護視窗較短的系統,你會遇到一些挑戰。例如,你創建索引的時候,很多會話被阻塞,你只能取消創建索引的任務。查看這些索引維護操作的進度、預估... ...


相信很多SQL Server DBA或開發人員在重建或重組大表索引時,都會相當鬱悶,不知道索引重建的進度,這個對於DBA完全是一個黑盒子,對於系統負載非常大的系統或維護視窗較短的系統,你會遇到一些挑戰。例如,你創建索引的時候,很多會話被阻塞,你只能取消創建索引的任務。查看這些索引維護操作的進度、預估時間對於我們有較大的意義,需要根據這個做一些決策。下麵我們來看看看看如何獲取CREATE INDEXALTER INDEX REBUILDALTER INDEX ORGANIZE的進度。

 

 

索引重組

 

SQL Server 2008開始,有個DMV視圖sys.dm_exec_requests,裡面有個欄位percent_complete表示以下命令完成的工作的百分比,這裡面就包括索引重組(ALTER INDEX REORGANIZE),這其中不包括ALTER INDEX REBUILD,可以查看索引重組(ALTER INDEX ORGANIZE)完成的百分比。也就是說在SQL Server 2008之前是無法獲取索引重組的進度情況的。

 

percent_complete

real

Percentage of work completed for the following commands:

ALTER INDEX REORGANIZE
AUTO_SHRINK option with ALTER DATABASE
BACKUP DATABASE
DBCC CHECKDB
DBCC CHECKFILEGROUP
DBCC CHECKTABLE
DBCC INDEXDEFRAG
DBCC SHRINKDATABASE
DBCC SHRINKFILE
RECOVERY
RESTORE DATABASE
ROLLBACK
TDE ENCRYPTION

Is not nullable.

 

 

測試環境:SQL Server 2008 2017 RTM CU13

 

SELECT  er.session_id ,
        er.blocking_session_id ,
        er.status ,
        er.command ,
        DB_NAME(er.database_id) DB_name ,
        er.wait_type ,
        et.text SQLText ,
        er.percent_complete
FROM    sys.dm_exec_requests er
        CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) et
WHERE   er.session_id = 57
        AND er.session_id <> @@SPID;

 

 

clip_image001

 

 

 

 

 

索引重建

 

上面DMV視圖sys.dm_exec_requests是否也可以查看索引重建的進度呢? 答案是不行,測試發現percent_complete這個進度一直為0,那麼要如何查看索引重建(INDEX REBUILD)的進度呢?

 

不過自SQL Server 2014開始,SQL Server提供了一個新特性:sys.dm_exec_query_profiles,它可以實時監控正在執行的查詢的進度情況(Monitors real time query progress while the query is in execution)。當然,需要啟用實時查詢監控才行。一般只需啟用會話級別的實時查詢監控,可以通過啟用SET STATISTICS XML ON; SET STATISTICS PROFILE ON;開啟。而從SQL Server 2016 (13.x)SP1 開始,您可以或者開啟跟蹤標誌 7412或使用 query_thread_profile 擴展的事件。下麵是官方文檔的描述:

 

In SQL Server 2014 (12.x) SP2 and later use SET STATISTICS PROFILE ON or SET STATISTICS XML ON together with the query under investigation. This enables the profiling infrastructure and produces results in the DMV for the session where the SET command was executed. If you are investigating a query running from an application and cannot enable SET options with it, you can create an Extended Event using the query_post_execution_showplan event which will turn on the profiling infrastructure.

In SQL Server 2016 (13.x) SP1, you can either turn on trace flag 7412 or use the query_thread_profile extended event.

 

 

--Configure query for profiling with sys.dm_exec_query_profiles 

SET STATISTICS PROFILE ON; 

GO 

 

--Or enable query profiling globally under SQL Server 2016 SP1 or above 

DBCC TRACEON (7412, -1); 

GO

 

ALTER INDEX Your_Index_Name ON Your_Table_Name REBUILD;

GO

 

 

 

 

DECLARE @SPID INT = 53;
 
;WITH agg AS
(
     SELECT SUM(qp.[row_count]) AS [RowsProcessed],
            SUM(qp.[estimate_row_count]) AS [TotalRows],
            MAX(qp.last_active_time) - MIN(qp.first_active_time) AS [ElapsedMS],
            MAX(IIF(qp.[close_time] = 0 AND qp.[first_row_time] > 0,
                    [physical_operator_name],
                    N'<Transition>')) AS [CurrentStep]
     FROM sys.dm_exec_query_profiles qp
     WHERE qp.[physical_operator_name] IN (N'Table Scan', N'Clustered Index Scan', N'Sort' , N'Index Scan')
     AND   qp.[session_id] = @SPID
), comp AS
(
     SELECT *,
            ([TotalRows] - [RowsProcessed]) AS [RowsLeft],
            ([ElapsedMS] / 1000.0) AS [ElapsedSeconds]
     FROM   agg
)
SELECT [CurrentStep],
       [TotalRows],
       [RowsProcessed],
       [RowsLeft],
       CONVERT(DECIMAL(5, 2),
               (([RowsProcessed] * 1.0) / [TotalRows]) * 100) AS [PercentComplete],
       [ElapsedSeconds],
       (([ElapsedSeconds] / [RowsProcessed]) * [RowsLeft]) AS [EstimatedSecondsLeft],
       DATEADD(SECOND,
               (([ElapsedSeconds] / [RowsProcessed]) * [RowsLeft]),
               GETDATE()) AS [EstimatedCompletionTime]
FROM   comp;
 

 

 

clip_image002

 

 

註意事項:SQL Server 2016 SP1之前,如果要使用sys.dm_exec_query_profiles查看索引重建的進度,那麼就必須在索引重建之前設置SET STATISTICS PROFILE ON or SET STATISTICS XML ON。 而自

SQL Server 2016 SP1之後,可以使用DBCC TRACEON (7412, -1);開啟全局會話的跟蹤標記,或者開啟某個會話的跟蹤標記,當然如果要使用sys.dm_exec_query_profiles查看索引重建的進度,也必須開啟7412跟蹤標記

,然後重建索引,否則也沒有值。

 

註意事項::索引重組時,sys.dm_exec_query_profiles中沒有數據。所以sys.dm_exec_query_profiles不能用來查看索引重組的進度。

 

 

新建索引

 

<

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近項目升級,需要把原來的oracle版本改為sql server版本。由於項目的分層設計,主要的修改內容也就是存儲過程,sql語句。如今改的七七八八,整理一下踩過的坑,備忘! ...
  • 一、監聽某一節點內容 二、監聽某節點目錄的變化 三、Zookeeper當太上下線的感知系統 1.需求:某分散式系統中,主節點有多台,可以進行動態上下限,當有任何一臺機器發生了動態的上下線, 任何一臺客戶端都能感知得到 2.思路: (1)創建客戶端與服務端 (2)啟動client端 並監聽 (3)啟動 ...
  • 一、Zookeeper概述 1.Zookeeper是Hadoop生態的管理者,它致力於開發和維護開源伺服器,實現高度可靠的分散式協調。 2.Zookeeper的兩大功能: (1)存儲數據 (2)監聽 3.Zookeeper的工作機制,如圖: 4.Zookeeper存儲結構,以樹狀結構存儲 5.Zoo ...
  • Redis 中資料庫鍵的過期時間都保存在過期字典中,當一個鍵過期了,Redis 存在三種不同的刪除策略:定時刪除、惰性刪除和定期刪除 ...
  • 筆記記錄自林曉斌(丁奇)老師的《MySQL實戰45講》 2) --日誌系統,一條SQL查詢語句如何執行 MySQL可以恢復到半個月內任意一秒的狀態,它的實現和日誌系統有關。上一篇中記錄了一條查詢語句是如何執行的,對於更新語句,這一套流程也是同樣會走一遍。與查詢流程不一樣的是,更新流程還涉及到兩個重要 ...
  • ORA-02266: unique/primary keys in table referenced by enabled foreign keys這篇博客是很早之前總結的一篇文章,最近導數時使用TRUNCATE清理主表數據又遇到了這個錯誤,發現還有其它解決方案: a) 禁用與主表相關的外鍵約束 b... ...
  • Oracle監聽器日誌文件(通常叫做listener.log)是一個純文本文件,它的大小是一直不斷增長的,在一個生產Oracle伺服器上,DBA會每日查看該文件,如檢查監聽器是否有異常停止,是否有惡意攻擊連接等,當這個文件特別大的時候,打開和瀏覽文件內容時可能比較慢。這時可能會想到將當前的日誌文件備 ...
  • oracle判斷是否為null nvl(參數1,參數2) ;如果參數1為null則返回參數2,否則返回參數1 mysql判斷是否為null ifnull(參數1,參數2) ;如果參數1為null則返回參數2,否則返回參數1 select nvl(null,'空值') from dual 結果:空值 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...