Как отследить время начала и окончания запроса в хранимой процедуре MySQL - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть хранимая процедура, которая выполняется один раз в день на задании cron.Хранимая процедура состоит из запуска нескольких SQL-запросов, чтобы завершить согласование данных на основе ежедневного обновления, получаемого из другого источника.

Моя цель - захватить START_TIME и END_TIME для каждого SQL-запроса, который выполняется вхранимая процедура, чтобы я мог анализировать и оптимизировать процесс.

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 //

Когда я вставляю INTO INTO в таблицы журнала, CURRENT_TIMESTAMP генерируется таблицей автоматически и получает точное время.

КогдаЯ пытаюсь обновить существующую запись с помощью CURRENT_TIMESTAMP после того, как процесс завершается с использованием NOW (6), он всегда находит то же самое точное значение, которое захватил START_TIME;до миллисекунд.

Как мне найти точное время?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...