从 SQL Server Management Studio 查看以前的查询结果

从 SQL Server Management Studio 查看以前的查询结果

昨晚我离开电脑时,在 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 排序

相关内容