在数据库日常开发和优化过程中,我们常常需要对不同版本的SQL存储过程进行性能对比,通过记录执行时间来评估优化方案的实际效果,以此判断调整是否真的提升了存储过程的运行效率。

性能对比的核心思路
存储过程性能对比的核心逻辑是控制变量,保证除待优化的逻辑外,其他运行条件完全一致,通过记录相同输入下的执行时长,量化对比不同版本的性能差异。需要重点关注三个要点:
- 统一测试环境,包括数据库配置、数据量、服务器负载等
- 多次执行取平均值,避免单次执行的偶然误差
- 明确记录时间点的选择,覆盖存储过程完整的执行周期
不同数据库的时间记录方法
MySQL环境实现
MySQL可以通过NOW(3)获取毫秒级时间戳,在存储过程执行前后分别记录时间,计算差值得到执行时长。
-- 创建测试存储过程,记录执行时间
DELIMITER //
CREATE PROCEDURE test_proc_perf()
BEGIN
DECLARE start_time DATETIME(3);
DECLARE end_time DATETIME(3);
DECLARE exec_duration DECIMAL(10,3);
-- 记录开始时间
SET start_time = NOW(3);
-- 待测试的存储过程逻辑,这里以简单查询为例
SELECT COUNT(*) FROM user_info WHERE age > 18;
-- 记录结束时间
SET end_time = NOW(3);
-- 计算执行时长(毫秒)
SET exec_duration = TIMESTAMPDIFF(MICROSECOND, start_time, end_time) / 1000;
-- 插入执行记录表
INSERT INTO proc_exec_log(proc_name, exec_time, duration_ms)
VALUES('test_proc_perf', NOW(), exec_duration);
END //
DELIMITER ;
-- 创建执行记录表
CREATE TABLE proc_exec_log(
id INT PRIMARY KEY AUTO_INCREMENT,
proc_name VARCHAR(100),
exec_time DATETIME,
duration_ms DECIMAL(10,3)
);
SQL Server环境实现
SQL Server可以使用SYSDATETIME()获取高精度时间,结合DATEDIFF函数计算时间差。
-- 创建执行记录表
CREATE TABLE proc_exec_log(
id INT IDENTITY(1,1) PRIMARY KEY,
proc_name NVARCHAR(100),
exec_time DATETIME,
duration_ms DECIMAL(10,3)
);
-- 创建测试存储过程
CREATE PROCEDURE test_proc_perf
AS
BEGIN
DECLARE @start_time DATETIME2(7);
DECLARE @end_time DATETIME2(7);
DECLARE @duration_ms DECIMAL(10,3);
-- 记录开始时间
SET @start_time = SYSDATETIME();
-- 待测试的存储过程逻辑
SELECT COUNT(*) FROM user_info WHERE age > 18;
-- 记录结束时间
SET @end_time = SYSDATETIME();
-- 计算执行时长(毫秒)
SET @duration_ms = DATEDIFF(MICROSECOND, @start_time, @end_time) / 1000.0;
-- 插入执行记录
INSERT INTO proc_exec_log(proc_name, exec_time, duration_ms)
VALUES('test_proc_perf', GETDATE(), @duration_ms);
END;
性能对比实验设计
要得到可靠的对比结果,需要按照规范的实验流程执行:
1. 准备测试数据
保证测试所用的数据表数据量一致,避免数据量差异影响结果。如果是生产环境测试,可以导出相同数据量的快照到测试库执行。
2. 多次执行取平均值
单次执行的结果容易受到数据库缓存、服务器临时负载的影响,建议每个版本的存储过程至少执行10次,取平均执行时长作为对比依据。
-- MySQL批量执行存储过程记录性能
DELIMITER //
CREATE PROCEDURE batch_test_proc()
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i < 10 DO
CALL test_proc_perf();
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
-- 执行批量测试
CALL batch_test_proc();
3. 对比结果分析
执行完成后,查询执行记录表分析对比结果:
-- 查询平均执行时长
SELECT
proc_name,
COUNT(*) AS exec_count,
AVG(duration_ms) AS avg_duration_ms,
MIN(duration_ms) AS min_duration_ms,
MAX(duration_ms) AS max_duration_ms
FROM proc_exec_log
GROUP BY proc_name;
优化效果评估方法
得到新旧版本存储过程的平均执行时长后,可以通过以下指标评估优化效果:
- 性能提升比例:(旧版本平均时长 - 新版本平均时长) / 旧版本平均时长 * 100%
- 绝对耗时减少:旧版本平均时长 - 新版本平均时长
- 稳定性评估:对比最大最小执行时长的差值,差值越小说明性能越稳定
如果优化后性能提升比例超过10%,且执行时长的波动范围缩小,说明优化方案有效。如果提升比例不足5%,则需要考虑进一步优化存储过程的逻辑,比如调整索引、简化查询条件、减少不必要的循环操作等。
注意事项
- 测试时关闭数据库的查询缓存,避免缓存影响执行时间的准确性
- 存储过程中的临时表、变量操作也需要纳入时间记录范围
- 如果存储过程有事务操作,需要保证测试时的事务逻辑和生产环境一致
- 不要在生产环境高峰时段执行性能测试,避免影响正常业务