Mysql
儲存過程延遲更多
儲存過程,它正在被延遲。如果我在 MySQL 命令行客戶端中呼叫儲存過程需要將近半個多小時。此過程是更新兩個表中的值
drop procedure IF EXISTS ALTERTABLEVALUES; delimiter $$ CREATE PROCEDURE ALTERTABLEVALUES() BEGIN DECLARE finished INT DEFAULT 1; DECLARE total_count INT DEFAULT 1; DECLARE val varchar(15); DECLARE i INT DEFAULT 1; DECLARE table_num INT; DECLARE table_tab varchar(5); DECLARE number_cursor CURSOR FOR select outpassNo,tab from tempnumbers; DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 0; drop temporary table if exists tempnumbers; CREATE TEMPORARY TABLE tempnumbers as select num,'temp' as tab from table1 where month(inTime)=2 and year(inTime)=2018 union select num,'vary' as tab from table2 where month(inTime)=2 and year(inTime)=2018 order by outpassNo; SET val = (select num from tempnumbers limit 1); SET total_count = (select count(*) from tempnumbers); OPEN number_cursor; get_values: LOOP FETCH number_cursor INTO table_num,table_tab; IF finished = 0 THEN LEAVE get_values; END IF; IF table_tab = 'temp' THEN update table1 set table1.num= val where table1.num= table_num; ELSE update table2 set table2.num= val where table2.num = table_num; END IF; SET val = val +1; END LOOP get_values; CLOSE number_cursor; DROP TEMPORARY TABLE tempnumbers; END; $$ delimiter ;
table1 有新插入的數據,table2 有來自 table1 的處理值。存在業務需求,根據某些標準,table2 中的很少數據每月移動到其他表。期望是將 table1 和 table2 的 numbers 列重新排序為具有 table2 缺失值的序列。
任何人都可以幫助處理儲存過程中沒有游標的結果集嗎?
由於您要返回臨時表並一一更新行,因此您應該在表上放置一個索引,以便更新更快。
alter table tempnumbers add index(num);
- 不要將數字放入
VARCHAR
. (回复val
:)UNION
如果您希望全部訂購, 請使用括號:( SELECT ... ) UNION ( SELECT ... ) ORDER BY ...
- 如果您不需要
val
交錯的值,請執行兩個 “multi-table”UPDATEs
,沒有游標。- 如果表目前沒有
AUTO_INCREMENT
列,請考慮ALTER TABLE ... ADD COLUMN val INT AUTO_INCREMENT
作為對行進行編號的一種方式。- 請說明編號的必要性。