Michael Hedgpeth Asked: 2011-05-03 19:32:44 +0800 CST2011-05-03 19:32:44 +0800 CST 2011-05-03 19:32:44 +0800 CST 在 SQL Server 中监视长时间运行的查询的最佳方法是什么? 772 我必须为我的数据库运行很多长时间运行的查询(重建索引、更新大量数据)。是否有替代方法可以在 SQL Server Management Studio 中运行查询并每隔一小时左右检查一次?我想在完成后收到电子邮件或发送消息,但不知道最好的工具。 sql-server sql-server-2008 4 个回答 Voted Best Answer yrushka 2011-05-04T00:21:05+08:002011-05-04T00:21:05+08:00 在 Gaius 帖子之后:您可以创建一个 .SQL 脚本,在脚本前面使用 db 来执行您需要的操作 -> 创建一个调用该脚本的操作系统类型的 SQL 代理作业: sqlcmd -E -S SERVERNAME -i"c:\YOURSCRIPT.sql" -o"C:\YOURSCRIPT_LOG.log" 添加新步骤并使用msdb.dbo.sp_send_dbmail程序发送电子邮件。可以自定义此功能以在邮件中显示来自 SQL 表的特定查询,以确认脚本的执行……例如重建索引的 dbcc showcontig。 Gaius 2011-05-03T23:58:33+08:002011-05-03T23:58:33+08:00 是的,只需使用xp_sendmail。您可以发送预先设置的消息或 SQL 语句的结果,同样简单。此功能从 SQL Server 6.5 开始可用,但在Denali中将被淘汰- 如果这将成为您操作的永久部分,那么您应该使用更“企业”的数据库邮件。 jcolebrand 2011-05-03T19:39:11+08:002011-05-03T19:39:11+08:00 您可以选择使用 SQL 作业吗?您可以通过那里进行通知等。至于获得间歇性通知,这将需要存储过程等中的一些代码。 datagod 2011-05-04T06:07:17+08:002011-05-04T06:07:17+08:00 我总是将消息写入“EventLog”表。在处理大量数据时,我将数据分块管理,并在每个块之后将状态更新写入 EventLog。 当我想检查长时间运行的进程的进度时,我只需查询 EventLog 表。 输出示例: ------------------ -- 我的大更新 -- ------------------ 开始时间:2011-05-03 10:00:00 要处理的记录:1,000,000 块:200 ---块 1--- 尝试更新 MyTable 更新记录:5000 剩余记录:995,000 吞吐量:每秒 4210 条记录 ---块 2-- 尝试更新 MyTable 更新记录:5000 剩余记录:990,000 吞吐量:每秒 3555 条记录 ---块 3-- 等等 我在 EventLog 表中也有列来跟踪消息的写入时间、写入消息的进程等。抱歉在我的示例中没有包含该信息。
在 Gaius 帖子之后:您可以创建一个 .SQL 脚本,在脚本前面使用 db 来执行您需要的操作 -> 创建一个调用该脚本的操作系统类型的 SQL 代理作业:
sqlcmd -E -S SERVERNAME -i"c:\YOURSCRIPT.sql" -o"C:\YOURSCRIPT_LOG.log"
添加新步骤并使用msdb.dbo.sp_send_dbmail程序发送电子邮件。可以自定义此功能以在邮件中显示来自 SQL 表的特定查询,以确认脚本的执行……例如重建索引的 dbcc showcontig。
是的,只需使用xp_sendmail。您可以发送预先设置的消息或 SQL 语句的结果,同样简单。此功能从 SQL Server 6.5 开始可用,但在Denali中将被淘汰- 如果这将成为您操作的永久部分,那么您应该使用更“企业”的数据库邮件。
您可以选择使用 SQL 作业吗?您可以通过那里进行通知等。至于获得间歇性通知,这将需要存储过程等中的一些代码。
我总是将消息写入“EventLog”表。在处理大量数据时,我将数据分块管理,并在每个块之后将状态更新写入 EventLog。
当我想检查长时间运行的进程的进度时,我只需查询 EventLog 表。
输出示例:
我在 EventLog 表中也有列来跟踪消息的写入时间、写入消息的进程等。抱歉在我的示例中没有包含该信息。