Oder ein Stored Procedure.
Die geht Zeile um Zeile durch und blockiert die quelle nicht
Ich muss aber eingestehen, ich habe keine Ahnung wie performant das ganze ist Auch habe ich sehr wenig Ahnung von Stored Procedure in MySQL.
Nachtrag:
Es lohnen sich die folgenden Überlegungen.
- Nur Daten updaten, die wirklich neu berechnet werden müsse
- Indexe sauber setzen
Die geht Zeile um Zeile durch und blockiert die quelle nicht
Ich muss aber eingestehen, ich habe keine Ahnung wie performant das ganze ist Auch habe ich sehr wenig Ahnung von Stored Procedure in MySQL.
Nachtrag:
Es lohnen sich die folgenden Überlegungen.
- Nur Daten updaten, die wirklich neu berechnet werden müsse
- Indexe sauber setzen
SQL:
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp1`()
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE v_id_c CHAR(36) DEFAULT '';
DECLARE v_cnt INT DEFAULT 0;
DECLARE cur1 CURSOR FOR
SELECT (
SELECT COUNT(*)
FROM tw_1 AS tw2, tw_cstm AS cstm2
WHERE 1
AND tw2.id = cstm2.id_c
AND cstm2.internal_user_id_c = cstm1.internal_user_id_c
AND cstm2.internal_cs_id_c = cstm1.internal_cs_id_c
AND tw2.date_entered <= tw1.date_entered
AND tw2.deleted = 0
) AS anzahl,
tw1.id
FROM tw_1 AS tw1, tw_cstm AS cstm1
WHERE 1
AND tw1.id = cstm1.id_c;
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET done = 1;
OPEN cur1;
get1: LOOP
FETCH cur1 INTO v_cnt, v_id_c;
IF done = 1 THEN
LEAVE get1;
END IF;
update tw_cstm t
set t.count_tw_c = v_cnt
where t.id_c = v_id_c;
-- build email list
END LOOP get1;
-- count_tw_c
END
Zuletzt bearbeitet: