mysql - 如何在 mySQL 存储过程中跟踪查询开始时间和结束时间
问题描述
我有一个每天在 cron 作业上执行一次的存储过程。存储过程由多个 SQL 查询组成,以便根据我们从另一个来源获得的每日更新完成数据协调。
我的目标是捕获在存储过程中执行的每个 SQL 查询的 START_TIME 和 END_TIME,以便我可以分析和优化该过程。
CREATE TABLE `SP_LOG` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`SP_NAME` varchar(255) NOT NULL,
`IN_PARAMS` varchar(4000) DEFAULT NULL,
`START_TIME` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`END_TIME` timestamp(6) NULL DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `IDX.SP_LOG.SP_NAME` (`SP_NAME`)
);
CREATE TABLE `SP_LOG_DETAIL` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`SP_ID` bigint(20) NOT NULL,
`MESSAGE` varchar(255) NOT NULL,
`START_TIME` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`END_TIME` timestamp(6) NULL DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `IDX.SP_LOG_DETAIL.SP_ID` (`SP_ID`),
CONSTRAINT `FK.SP_LOG_DETAIL.SP_ID` FOREIGN KEY (`SP_ID`)
REFERENCES `SP_LOG` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
);
DROP PROCEDURE IF EXISTS `SP_PROCESS_USERS`;
DELIMITER //
CREATE PROCEDURE `SP_PROCESS_USERS`(IN spLocation VARCHAR(60))
BEGIN
/*
* -- Handle Exception --
*/
DECLARE spLogId BIGINT(20);
DECLARE spLogDetailId BIGINT(20);
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
INSERT INTO SP_LOG(SP_NAME, IN_PARAMS, END_TIME) VALUES ('SP_PROCESS_USERS', spMarket, NOW(6));
SELECT LAST_INSERT_ID() INTO spLogId;
INSERT INTO SP_LOG_DETAIL(SP_ID, MESSAGE, END_TIME) VALUES (spLogId, CONCAT('SQLEXCEPTION==>', @p1, ':', @p2), NOW(6));
END;
INSERT INTO SP_LOG(SP_NAME, IN_PARAMS) VALUES ('SP_PROCESS_USERS', spLocation);
SELECT LAST_INSERT_ID() INTO spLogId;
/*
* -- Process Users Part 1 --
*/
INSERT INTO SP_LOG_DETAIL(SP_ID, MESSAGE) VALUES (spLogId, 'Process Users #1');
SELECT LAST_INSERT_ID() INTO spLogDetailId;
... Logic ...
UPDATE SP_LOG_DETAIL SET END_TIME = NOW(6) WHERE ID = spLogDetailId;
... Part 2, 3, ... n
UPDATE SQ_5G_SP_LOG SET END_TIME = NOW(6) WHERE ID = spLogId;
END //
当我插入日志表时,表会自动生成 CURRENT_TIMESTAMP 并获取准确的时间。
当我在进程完成使用 NOW(6) 后尝试使用 CURRENT_TIMESTAMP 更新现有记录时,它总是找到与 START_TIME 捕获的相同的确切值;精确到毫秒。
我怎样才能找到准确的时间?
解决方案
推荐阅读
- android - Directions API 返回 0 条路线
- html - 有没有一种方法可以将一个 html 文件的 div 标签的路径写入 django 中的另一个 html 文件 {% url 'file_name' %}
- json - 用于创建 EMR 集群的 Cloudformation 模板
- wordpress - 动态更改重力表格表单上的字段标签
- android - Android WebView 从内部存储加载 | 安卓 11 | 安卓
- sql - 将数据从一个表连接到另一个表
- c - vfprintf 中的段错误,堆栈损坏
- javascript - 副作用可以包含在不纯计算和惰性的描述中吗?
- jenkins - Jenkins - 如何选择要部署到的 Kubernetes 服务器?
- angular - Angular 明确排除包