Upload location took very long time - revamp the validationcode

Creation date: 11/05/2022 18:22    Updated: 11/05/2022 18:22   #location #validationcode
Question:

Summary of issue/request/query

Uploading 500 locations took 5 hours and 15 minutes


Attachment




T/ 1st Line Support Investigation Comment

Usually does not took this long, need to investigate the upload script


Answer:

Include in index:

CREATE INDEX I_TMP_VALIDATIONCODE_S ON TMP_VALIDATIONCODE(seq);


Investigation:

The problem with insert trigger in the BAS_LOCATION
CREATE 
DEFINER = 'app'@'%'
TRIGGER app.TRG_GENERATE_VALIDATEION_CODE
BEFORE INSERT
ON app.BAS_LOCATION
FOR EACH ROW
BEGIN
DECLARE sValidationCode varchar(10);
DECLARE nCount int;

SET sValidationCode := '*';

REPEAT
SET sValidationCode := CONCAT (
        CHAR(FLOOR(RAND()*26)+65), CHAR(FLOOR(RAND()*26)+65),
        CHAR(FLOOR(RAND()*26)+65), CHAR(FLOOR(RAND()*26)+65)); <- the issue
SET nCount := 0;
SELECT COUNT(validationCode) FROM BAS_LOCATION
WHERE validationCode = sValidationCode
LIMIT 1
INTO nCount;
IF nCount > 0 THEN
SET sValidationCode := '*';
END IF;

UNTIL sValidationCode <> '*'
END REPEAT;

SET new.validationCode = sValidationCode;
END

Revamp the whole set of getting the validation code as below:

CREATE TABLE `TMP_VALIDATIONCODE` (
`VALIDATIONCODE` VARCHAR(4) NOT NULL,
`seq` INT,
PRIMARY KEY (`VALIDATIONCODE`)
);


-------------------------------------------------

DELIMITER $$


DROP PROCEDURE IF EXISTS `FLUX_SPCUS_VALIDATIONCODE`$$


CREATE PROCEDURE `FLUX_SPCUS_VALIDATIONCODE`()
BEGIN
SET @i = 0;
WHILE @i < 26 DO


SET @j = 0;
WHILE @j < 26 DO

SET @k = 0;
WHILE @k < 26 DO

SET @l = 0;
WHILE @l < 26 DO

INSERT INTO TMP_VALIDATIONCODE (VALIDATIONCODE, seq) VALUES
(CONCAT(CHAR(@i + 65), CHAR(@j + 65), CHAR(@k + 65), CHAR(@l + 65)), RAND()*32767);
SET @l = @l + 1;
END WHILE;
SET @k = @k + 1;
END WHILE;
SET @j= @j + 1;
END WHILE;
SET @i = @i + 1;
END WHILE;
END$$


DELIMITER ;


--------------------------------------------------

CALL FLUX_SPCUS_VALIDATIONCODE;



DELETE A FROM TMP_VALIDATIONCODE A
INNER JOIN BAS_LOCATION B ON A.VALIDATIONCODE = B.VALIDATIONCODE;


-------------------------------------------------

CREATE
DEFINER = 'app'@'%'
TRIGGER app.TRG_GENERATE_VALIDATEION_CODE
BEFORE INSERT
ON app.BAS_LOCATION
FOR EACH ROW
BEGIN
DECLARE sValidationCode varchar(10);
DECLARE nCount int;

SET sValidationCode := '*';
SELECT ValidationCode
into sValidationCode
FROM TMP_VALIDATIONCODE
order by seq
limit 1 for update;
delete from TMP_VALIDATIONCODE where ValidationCode = sValidationCode;

SET new.validationCode = sValidationCode;
END

Files