我正在使用 SQL Server。我正在编写一个执行一系列查询的存储过程。我想记录每个查询的执行时间。是否可以?请帮忙。
4 回答
使用日志表的示例:
create procedure procedure_name
as
begin
declare @start_date datetime = getdate(),
@execution_time_in_seconds int
/*你的过程代码在这里*/
@execution_time_in_seconds = datediff(SECOND,@start_date,getdate())
插入你的 logging_table(execution_time_column) values(@execution_time_in_seconds )
结束
引擎已经将执行统计信息保存在sys.dm_exec_query_stats
. 在您将繁重的日志记录添加到您的过程中的日志表之前,请考虑您可以从这些统计信息中提取什么。包含以下值:
- 执行次数
- 执行时间(经过)
- 工作时间(并行查询中所有 CPU 的非阻塞实际 CPU 时间)
- 逻辑读/写
- 物理读取
- 返回的行数
这种信息对于性能调查来说比你在幼稚的方法中登录的信息要丰富得多,也更有用。大多数指标包含最小值、最大值和总值(通过执行计数,您还可以得到平均值)。您可以立即了解什么是昂贵的查询(经过的平均值较大的查询),哪些是经常阻塞的查询(经过的时间远高于工作时间),会导致大量写入或读取,会返回大量结果等.
您可以通过跟踪时间戳CURRENT_TIMESTAMP
并在要执行的语句之前和之后记录它,然后记录它们,然后比较它们以查看,当然还有有意义的消息,指示什么时候开始和结束。或者,如果您也想查看它,也可以使用它:SET STATISTICS TIME ON
以及SET STATISTICS TIME OFF
我在查询分析器中使用的这个。
根据您确切想要的内容,您需要确定将这些消息存储在何处以进行日志记录。像一张桌子或其他东西。
使用 PRINT & GETDATE 记录执行时间信息
例子:
DECLARE @Time1 DATETIME
DECLARE @Time2 DATETIME
DECLARE @Time3 DATETIME
DECLARE @STR_TIME1 VARCHAR(255)
DECLARE @STR_TIME2 VARCHAR(255)
DECLARE @STR_TIME3 VARCHAR(255)
--{ execute query 1 }
SET @Time3 = GETDATE()
--{ execute query 2 }
SET @Time2 = GETDATE()
--{ execute query 3 }
SET @Time3 = GETDATE()
SET @STR_TIME1 = CONVERT(varchar(255),@Time1,109)
SET @STR_TIME2 = CONVERT(varchar(255),@Time2,109)
SET @STR_TIME3 = CONVERT(varchar(255),@Time3,109)
PRINT 'T1 is' + @STR_TIME1
PRINT 'T2 is ' + @STR_TIME2
PRINT 'T3 is ' + @STR_TIME3