昨晚我离开电脑时,在 SQL Server Management Studio 的查询编辑器中运行了批量删除。在将脚本用于实时数据库之前,我运行此脚本来测试大型数据库上的删除速度。晚上我的电脑重新启动进行更新。我想知道是否有任何方法可以查看先前执行的语句的日志,并查看执行所需的时间。它正在从 SQL Server 2000 中删除。谢谢!
答案1
实现此目的的唯一方法是在操作之前(和操作期间)设置某种形式的监控流程。例如,Profiler 工具允许您记录任何批次的持续时间(以及任何语句,但不是结果),或者您可以发出或SELECT
显示语句之前和之后的PRINT
结果。getdate()
对于 这样的修改操作DELETE
,事务日志中会有记录(假设它此后没有被截断,并且有日志备份或简单恢复模式下的检查点),但普通人无法使用内置工具检查事务日志。虽然有第三方日志检查器可用,但事务日志显示操作发生的时间,它不包含有关其持续时间的信息 :)
我意识到这是亡羊补牢,但是没有内置记录可以记录重启后发生的情况,很抱歉!
答案2
也许普通人无法查看日志文件,但 DBA 可以收集各种信息。下面是一些查询,可帮助您入门。
-- Run this query to get the transaction ID
USE YourDatabase
GO
SELECT
[Transaction ID],
Operation,
Context,
AllocUnitName
FROM
fn_dblog(NULL, NULL)
WHERE
Operation = 'LOP_DELETE_ROWS'
and AllocUnitName like '%YourTableName%'
ORDER by [transaction ID] desc
-- Run this query to find the transaction SID
SELECT
Operation,
[Transaction ID],
[Begin Time],
[End Time],
[Transaction Name],
[Transaction SID]
FROM
fn_dblog(NULL, NULL)
WHERE
[Transaction ID] = 'TransactionID from above'
-- or use below to search using time instead of transaction ID
[Begin Time] between 'starttime' and 'endtime'
AND
[Operation] = 'LOP_BEGIN_XACT'
-- Run this to determine who ran the delete
USE MASTER
GO
SELECT SUSER_SNAME([Transaction SID from above])
答案3
我知道这已经很老了,但是这个查询对于恢复您运行但丢失的脚本或其他 SQL 很有帮助。
选择 execquery.last_execution_time 作为 [日期时间],execsql.text 作为 [脚本] 从 sys.dm_exec_query_stats 作为 execquery 交叉应用 sys.dm_exec_sql_text(execquery.sql_handle) 作为 execsql 按 execquery.last_execution_time DESC 排序