相信很多SQL Server DBA或开发人员在重建或重组大表索引时,都会相当郁闷,不知道索引重建的进度,这个对于DBA完全是一个黑盒子,对于系统负载非常大的系统或维护窗口较短的系统,你会遇到一些挑战。例如,你创建索引的时候,很多会话被阻塞,你只能取消创建索引的任务。查看这些索引维护操作的进度、预估时间对于我们有较大的意义,需要根据这个做一些决策。下面我们来看看看看如何获取CREATE INDEX、ALTER INDEX REBUILD、ALTER 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;

索引重建

 

上面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;

 

注意事项:在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不能用来查看索引重组的进度。

新建索引

 

新建索引进度的查询,也可以使用下面SQL语句。这里不做展开。

DECLARE @SPID INT = 56;

 

;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;

 

 

 

SELECT   

       node_id,

       physical_operator_name, 

       SUM(row_count) row_count, 

       SUM(estimate_row_count) AS estimate_row_count,

       CAST(SUM(row_count)*100 AS float)/SUM(estimate_row_count)  as estimate_percent_complete

FROM sys.dm_exec_query_profiles   

WHERE session_id=@SPID  

GROUP BY node_id,physical_operator_name  

ORDER BY node_id desc;

参考资料:

https://docs.microsoft.com/zh-cn/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-query-profiles-transact-sql?view=sql-server-2017

https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-requests-transact-sql?view=sql-server-2017

https://dba.stackexchange.com/questions/139191/sql-server-how-to-track-progress-of-create-index-command

https://support.microsoft.com/zh-cn/help/4053291/fix-sys-dm-exec-query-profiles-dmv-returns-wrong-estimate-row-count-in

https://blogs.msdn.microsoft.com/sql_pfe_blog/2016/12/22/create-index-monitoring-progress/

SQL Server查看索引重建、重组索引进度的更多相关文章

  1. SQL Server查询性能优化——创建索引原则(一)

    索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页 就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索 ...

  2. SQL Server 查询性能优化——创建索引原则(一)(转载)

    索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索引 ...

  3. SQL Server 查询性能优化——创建索引原则(一)

    索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索引 ...

  4. SQL Server 2016 —— 聚集列存储索引的功能增强

    作者 Jonathan Allen,译者         邵思华         发布于     2015年6月14日   聚集列存储索引(CC Index)是SQL Server 2014中两大最引 ...

  5. SQL Server 查询性能优化——创建索引原则

    索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索引 ...

  6. SQL Server数据库性能优化之索引篇【转】

    http://www.blogjava.net/allen-zhe/archive/2010/07/23/326966.html 性能优化之索引篇 近期项目需要, 做了一段时间的SQL Server性 ...

  7. SQL server 表中如何创建索引?

    SQL server 表中如何创建索引?看个示例,你就会了 use master goif db_id(N'zhangxu')is not nulldrop database zhangxugocre ...

  8. SQL Server查询性能优化——覆盖索引(二)

    在SQL Server 查询性能优化——覆盖索引(一)中讲了覆盖索引的一些理论. 本文将具体讲一下使用不同索引对查询性能的影响. 下面通过实例,来查看不同的索引结构,如聚集索引.非聚集索引.组合索引等 ...

  9. SQL索引管理器 - 用于SQL Server和Azure上的索引维护的免费GUI工具

    我作为SQL Server DBA工作了8年多,管理和优化服务器的性能.在我的空闲时间,我想为宇宙和我的同事做一些有用的事情.这就是我们最终为SQL Server和Azure 提供免费索引维护工具的方 ...

  10. SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区

    一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...

随机推荐

  1. 网络Socket编程及实例

    1 TCP和UDP介绍 在介绍TCP和UDP之前,有必要先介绍下网络体系结构的各个层次. 1.1  网络体系结构 协议:控制网络中信息的发送和接收.定义了通信实体之间交换报文的格式和次序,以及在报文传 ...

  2. 如何在Visual Studio和CodeBlocks中反编译C++代码

    在Visual Studio中 第一步:打断点 第二步:Debug->Star Debugging 或直接按"F5" 第三步:Debug->Windows->Di ...

  3. css中的单冒号和双冒号

    最近突然被别人问起css单冒号和双冒号有什么区别,答曰:"不知道". 虽然还在填坑中,但作为一个跨过了初级的FEer,感觉着实汗颜,刚好今天下午在搜别的问题的时候,突然看到一个对比 ...

  4. 解决Apache Web Server的几个错误

    一.安装好Apache后服务里没有Apache服务 在命令行进入安装apache的bin目录下,输入命令 httpd.exe -k install -n Apache2.4 二.Apache web ...

  5. MongoDB与python交互

    1.Pymongo PyMongo是Mongodb的Python接口开发包,是使用python和Mongodb的推荐方式.官方文档 2.安装 进入虚拟环境 sudo pip install pymon ...

  6. Guns(开源后台管理系统框架)实战(一)——开发环境搭建

    1. 开发环境搭建 1.1. 开发环境要求 1.2. 配置Maven 1.3. 配置MySQL 1.4. Git克隆项目 1.5. Eclipse导入系统 2. 小结 3. 参考引用 1. 开发环境搭 ...

  7. 关于find命令的一些知识

    在服务器运维的过程中,我们会用到这样一个命令,关于这个命令,你知道多少呢?接下来,咱们一起来研究一下它的用途. find命令主要用来在硬盘上搜索文件, find命令主要用于文件查找,列出当前目录及子目 ...

  8. [UOJ#207. 共价大爷游长沙]——LCT&随机化

    题目大意: 传送门 给一颗动态树,给出一些路径并动态修改,每次询问一条边是否被所有路径覆盖. 题解: 先%一发myy. 开始感觉不是很可做的样子,发现子树信息无论维护什么都不太对…… 然后打开题目标签 ...

  9. B20J_2733_[HNOI2012]永无乡_权值线段树合并

    B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...

  10. BZOJ_4773_负环_倍增弗洛伊德

    BZOJ_4773_负环 Description 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得 环上的边权和为负数.保证图中不包含重边 ...