Mysql

儲存過程延遲更多

  • September 12, 2020

儲存過程,它正在被延遲。如果我在 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作為對行進行編號的一種方式。
  • 請說明編號的必要性。

引用自:https://dba.stackexchange.com/questions/206702