相信很多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_completeFROM    sys.dm_exec_requests erCROSS APPLY sys.dm_exec_sql_text(er.sql_handle) etWHERE   er.session_id = 57AND 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 ontrace flag 7412or 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

ALTERINDEXYour_Index_NameONYour_Table_NameREBUILD;

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'')) AS [CurrentStep]FROM sys.dm_exec_query_profiles qpWHERE 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'')) AS [CurrentStep]FROM sys.dm_exec_query_profiles qpWHERE qp.[physical_operator_name] IN (N'Table Scan', N'Clustered Index Scan', N'Sort' , N'Index Scan')ANDqp.[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;SELECTnode_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_completeFROM sys.dm_exec_query_profilesWHERE session_id=@SPIDGROUP BY node_id,physical_operator_nameORDER 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/

mysql查看索引创建进度_SQL Server查看索引重建、重组索引进度相关推荐

  1. mysql 查询视图是否存在_sql server判断数据库、表、列、视图是否存在

    1 判断数据库是否存在 if exists (select * from sys.databases where name = '数据库名') drop database [数据库名] 2 判断表是否 ...

  2. mysql查询加伪列_SQL Server数据库中伪列及伪列的含义详解

    SQL Server中的伪列 下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值:对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个 ...

  3. mysql查看数据库创建语句_sql语句1数据库创建、查看

    SQL语句从功能上可以区分如下三类: DML(Data Manipulation Language)数据操作语言 |-用于检索和修改数据 DDL(DataDefinition Language)数据定 ...

  4. sql查看数据库线程数_SQL Server始终在可用性组数据库上的最大辅助线程

    sql查看数据库线程数 This article gives an overview of the Max Worker Threads for the SQL Server Always On Av ...

  5. java查看sql视图_SQL Server查看视图定义总结

    在SQL Server中如何查看数据库视图的定义呢? 其实官方文档已经有一个较详细的总结了,这里在官方文档的基础上,我们再深入展开分析一下,例如如何获取系统视图的定义.知其然知其所以然吗. 1:使用S ...

  6. python 查询sqlserver 视图_SQL Server查看视图定义总结

    在SQL Server中如何查看数据库视图的定义呢? 其实官方文档已经有一个较详细的总结了,这里在官方文档的基础上,我们再深入展开分析一下,例如如何获取系统视图的定义.知其然知其所以然吗. 1:使用S ...

  7. 十七、MySQL触发器(创建、删除、查看)详解

    触发器 一.介绍 触发器是与表有关的数据库对象,指在 insert/update/delete 之前或之后,触发并执行触发器中定义的SQL语句集合.触发器的这种特性可以协助应用在数据库端确保数据的完整 ...

  8. java sql 创建触发器_SQL Server创建触发器

    在本教程中,将学习如何使用SQL Server CREATE TRIGGER语句来创建新的触发器. SQL Server CREATE TRIGGER语句简介 CREATE TRIGGER语句用于创建 ...

  9. sql简单带索引的语句_SQL Server 2017:栏目索引和简单计划

    sql简单带索引的语句 Some time ago, SQL Server 2017 was released and issued as CTP. The most exciting release ...

最新文章

  1. RAID0、RAID1、RAID0+1模式实战评测
  2. windows下sqlite3的基本操作
  3. 为在innodb中什么主键用auto_increment效率会提高
  4. 【2014】【辛星】【php】【秋季】【2】第一个php程序
  5. Kubernetes 从懵圈到熟练:集群服务的三个要点和一种实现
  6. Spring DI[依赖注入]
  7. mysql事务服务_MySQL (事务篇)
  8. dubbo管理控制台安装和使用
  9. 【Spring Boot】【Thymeleaf】The SpringStandard Dialect
  10. Redis 6.0 正式版终于发布了!除了多线程还有什么新功能?
  11. VDI序曲十四 使用 RemoteFX 安装和配置 USB 重定向
  12. 视觉SLAM-显示相机的位姿
  13. 巅峰对决 Spring Boot VS .NET 6
  14. Atitit 常用数据类型有哪些 目录 1.1. 数值类型 整数 小数 自增整数 1 1.2. 货币类型 1 1.3. 字符类型 字符串 2 1.4. 日期/时间类型 时间戳 2 1.5. Ur
  15. paip.重装系统后firefox火狐收藏夹的恢复
  16. 在线教育源码可实现的功能
  17. 管理者必须要精通的六项管理技能
  18. 龙芯 Linux usb,使用debirf制作龙芯2F的LiveUSB
  19. make编译源码时报error: ‘for’ loop initial declarations are only allowed in C99 mode的解决办法
  20. 怎样查询自己正在上网的路由器的IP地址?网络节点跟踪命令tracert的用法

热门文章

  1. JBoss AS 7:自定义登录模块
  2. 使用JacpFX和JavaFX2构建富客户端
  3. 更换mysql_安利给你,关于MySQL字符集乱码与解决方案
  4. python奇偶求和_python 判断奇偶并求和,运行过程有错误,希望高手给指导一下。...
  5. qq消息连发代码_我们用的QQ是怎样实现通讯的
  6. gis里创建要素面板怎么打开_【从零开始学GIS】ArcGIS中的绘图基本操作(二)
  7. 反码、原码、补码的观点阐述
  8. mysql 触发器计算总价,mysql’插入’触发器根据其他字段计算字段
  9. java连接mongodb的jar包_Java实战之管家婆记账系统(1)——项目简述
  10. js如何监听元素事件是否被移除_JavaScript 监听元素是否进入/移出可视区域