【发布时间】:2020-10-08 21:43:20
【问题描述】:
我正在将 MSSQL DB 迁移到 MySQL。而且我有一个 SP 可以在表中插入很多内容,它的工作正常 y mssql 但 Mysql 中的相同过程需要太多时间。我读到,使许多插入不是执行得更快的东西。
它是一个在每个循环中进行插入的while循环。
我想知道您是否有更快的方法来做到这一点?
例如,当我在 python 中执行此操作时,我将选择添加到列表中,并在循环结束时只插入所有行。我试图弄清楚如何在 mysql SP 中执行此操作。
这是SP,但我不能把我调用的所有表都放在这里。
CREATE DEFINER=`root`@`localhost` PROCEDURE `SP_indisp_cscs3`()
BEGIN
/*BORRA LA INFORMACION A SER REPROCESADA*/
DELETE FROM indisp;
/*WHERE mes = MONTH(CURDATE())
AND año = YEAR(CURDATE());*/
/*Comienza la fiesta, se armó la culiandanga*/
SET @row = (SELECT min(cscsID) from cscs where month(inicio) = month(curdate()) AND YEAR(inicio) = YEAR(curdate()));
WHILE @row <= (SELECT max(cscsID) from cscs ) DO
SET @inicio = (SELECT inicio FROM cscs WHERE cscsid = @row);
SET @fin = (select fin from cscs where cscsid = @row);
SET @hourini = @inicio;
SET @compID = (select compID from cscs where cscsid = @row);
SET @vencomp = (select ven_comp from cscs where cscsid = @row);
SET @venserv = (select ven_serv from cscs where cscsid = @row);
WHILE @inicio < @fin AND MONTH(@inicio) = MONTH(CURDATE()) AND YEAR(@inicio) = YEAR(CURDATE()) DO
INSERT INTO indisp (ticketid)/*, diasem, splitdate, año,mes, hour,affected, compID, serv_pais_prodID, ven_comp,ven_serv)*/
VALUES (
(select ticketid from cscs where cscsid = @row)/*,
DAYOFWEEK(@inicio),
@inicio,
year(@inicio),
month(@inicio),
@hourini,
1,
@compID,
(select serv_pais_prodID from cscs where cscsID = @row),
(select CASE
WHEN @vencomp = 1 THEN (select venx from ven1 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @vencomp = 2 THEN (select venx from ven2 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @vencomp = 3 THEN (select venx from ven3 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @vencomp = 4 THEN (select venx from ven4 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @vencomp = 5 THEN (select venx from ven5 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @vencomp = 6 THEN (select venx from ven6 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @vencomp = 7 THEN (select venx from ven7 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @vencomp = 8 THEN (select venx from ven8 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @vencomp = 9 THEN (select venx from ven9 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @vencomp = 10 THEN (select venx from ven10 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @vencomp = 11 THEN (select venx from ven11 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @vencomp = 12 THEN (select venx from ven12 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @vencomp = 13 THEN (select venx from ven13 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
ELSE 0
END),
(select CASE
WHEN @venserv = 1 THEN (select venx from ven1 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @venserv = 2 THEN (select venx from ven2 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @venserv = 3 THEN (select venx from ven3 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @venserv = 4 THEN (select venx from ven4 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @venserv = 5 THEN (select venx from ven5 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @venserv = 6 THEN (select venx from ven6 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @venserv = 7 THEN (select venx from ven7 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @venserv = 8 THEN (select venx from ven8 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @venserv = 9 THEN (select venx from ven9 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @venserv = 10 THEN (select venx from ven10 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @venserv = 11 THEN (select venx from ven11 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @venserv = 12 THEN (select venx from ven12 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
WHEN @venserv = 13 THEN (select venx from ven13 WHERE hour = DATE_FORMAT(@inicio,'%H:%i:%s') and diasem = DAYOFWEEK(@inicio))
ELSE 0
END) */
);
SET @inicio = @inicio + INTERVAL 1 MINUTE;
END WHILE;
SET @row = @row +1;
END WHILE;
UPDATE indisp
SET ven_serv = 0
WHERE ven_serv IS NULL;
END
【问题讨论】:
标签: mysql performance loops insert