[英]Calling stored procedure in MySQL takes forever to execute
我有一个我试图调用的存储过程,它需要永远执行。 我不知道出了什么问题。 另一个数据库中的类似存储过程完美执行。 我不熟悉MySQL Workbench
,所以我不知道数据库设置是否不同或什么的。
以下是我的存储过程:
CREATE
DEFINER = `admin`@`%`
PROCEDURE `calculate_daily_coil_moved_by_crane_data`()
BEGIN
set @curr_date = curdate();
set @pre_date = date_add(curdate(), interval -1 day);
set @a_shift_start_ts = concat(@pre_date, ' 06:00:00');
set @a_shift_end_ts = concat(@pre_date, ' 13:59:59');
set @b_shift_start_ts = concat(@pre_date, ' 14:00:00');
set @b_shift_end_ts = concat(@pre_date, ' 21:59:59');
set @c_shift_start_ts = concat(@pre_date, ' 22:00:00');
set @c_shift_end_ts = concat(@curr_date, ' 05:59:59');
SELECT @curr_date,
@pre_date,
@a_shift_start_ts,
@a_shift_end_ts,
@b_shift_start_ts,
@b_shift_end_ts,
@c_shift_start_ts,
@c_shift_end_ts;
#SET DATA
insert into daily_coil_move_by_crane_data_for_report (crane_id, crane_name, date, a_shift, b_shift, c_shift)
select cr.id, cr.name, @pre_date, 0, 0, 0
from yms_phase3.crane cr
where active = 1
order by cr.name;
#----------------------------------------------------------------------------------------------------
#--> COILS MOVED BY CRANE A Shift <--
#----------------------------------------------------------------------------------------------------
SET @shift = 'A';
#FETCH ROW DATA
update daily_coil_move_by_crane_data_for_report
set a_shift = ifnull((select COUNT(*)
FROM yms_phase3.workorder_history in_data
where in_data.crane_id = daily_coil_move_by_crane_data_for_report.crane_id
and current_execution_status IN (6 , 7)
and in_data.pick_ts between @a_shift_start_ts and @a_shift_end_ts
group by in_data.crane_name), 0)
where (a_shift is null or a_shift = 0);
#----------------------------------------------------------------------------------------------------
#--> COILS MOVED BY CRANE B Shift <--
#----------------------------------------------------------------------------------------------------
SET @shift = 'B';
#FETCH ROW DATA
update daily_coil_move_by_crane_data_for_report
set b_shift = ifnull((select COUNT(*)
FROM yms_phase3.workorder_history in_data
where in_data.crane_id = daily_coil_move_by_crane_data_for_report.crane_id
and current_execution_status IN (6 , 7)
and in_data.pick_ts between @b_shift_start_ts and @b_shift_end_ts
group by in_data.crane_name), 0)
where (b_shift is null or b_shift = 0);
#----------------------------------------------------------------------------------------------------
#--> COILS MOVED BY CRANE C Shift <--
#----------------------------------------------------------------------------------------------------
SET @shift = 'C';
#FETCH ROW DATA
update daily_coil_move_by_crane_data_for_report
set c_shift = ifnull((select COUNT(*)
FROM yms_phase3.workorder_history in_data
where in_data.crane_id = daily_coil_move_by_crane_data_for_report.crane_id
and current_execution_status IN (6 , 7)
and in_data.pick_ts between @c_shift_start_ts and @c_shift_end_ts
group by in_data.crane_name), 0)
where (c_shift is null or c_shift = 0);
#----------------------------------------------------------------------------------------------------
#INSERT ALL CRANE ENTRY
insert into daily_coil_move_by_crane_data_for_report (crane_id, crane_name, date, a_shift, b_shift, c_shift)
select -1, 'ALL', @pre_date, SUM(a_shift), sum(b_shift), sum(c_shift)
from daily_coil_move_by_crane_data_for_report
where date = @pre_date
group by date;
#UPDATE TOTAL
update daily_coil_move_by_crane_data_for_report
set total_coils_moved = (a_shift + b_shift + c_shift)
where date = @pre_date;
END
还尝试使用以下方法从Java
执行查询:
jdbcTemplate.execute("CALL calculate_daily_coil_moved_by_crane_data;");
但它给了我以下异常:
java.sql.SQLException: Lock wait timeout exceeded
我可以做些什么来解决这个问题?
请尝试编辑配置文件,并在堆栈中搜索相同的文件。 检查时有某些可能性,
检查并编辑 MySQL 硬盘驱动器上的配置文件,增加缓存容量和默认值,因为默认值以 KB 为单位,分配的内存非常少,要执行如此大的程序,它至少应该是一些 MB。
增加连接字符串超时,即以秒为单位设置正确的时间。 默认情况下它是 60 秒,这对于执行这样的过程来说非常少,我认为在 c# 中至少我们将它设置为 '0' 秒,这意味着它在查询执行之前不会超时。
如果有任何左联接/内部查询,请尝试检查是否在内部联接中产生了相同的输出? 因为内连接比左连接或右连接快。
添加索引,正确映射外键引用以更快地执行查询。 希望它有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.