此过程正在运行,但需要 5 分钟才能运行。有没有更快、更简单的方法?
我有一个包含检查列表的表。稍后会在同一张表中插入后续检查。后续检查具有相同的序列号但不同的日期戳。我需要找出哪些检查没有完成后续检查。
所以首先我得到了所有 type_due=3 并且没有标记为inspection_completed 的serial_numbers。
然后,从这个序列号列表中,我正在检查是否在稍后的 date_stamp 有相同序列号的检查,标记为检查完成。
因此,仅当存在其他内容时才选择;如果第二个查询中的结果具有相同的序列号、更大的日期和非空的inspection_completed 值,则消除第一个查询中的结果池。
每次运行此查询时,我都会截断 Inspections_due 表,因为添加到 Inspections 表的新后续检查将使 Inspections_due 表中的某些结果不再有效。
第一个查询有大约 9,000 个结果。总体而言,编写另一个查询以删除 Inspections_due 表中的无效结果并仅在每次运行此查询时将新记录添加到 Inspections_due 可能会更快。
注意:我尝试了 Select count(*) 而不是 Select Exists,但速度差异不大。
任何建议都会很棒!谢谢
CREATE PROCEDURE create_due_inspections()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE iid int(10); #unique inspection id
DECLARE sn VARCHAR(16); #serial number
DECLARE dt date; #date_stamp
DECLARE `result` int;
DECLARE cur1 CURSOR FOR SELECT inspection_id, serial_number, date_stamp FROM
Inspections where type_due = '3' and inspection_completed is null;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
TRUNCATE TABLE `Inspections_due`; # clean out the old results
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO iid,sn,dt;
IF done THEN
LEAVE read_loop;
END IF;
SET `result` := (select exists(Select inspection_id from Inspections
where serial_number = sn and date_stamp > dt and inspection_completed is not null));
IF `result` THEN
insert into Inspections_due values(iid);
END IF;
END LOOP;
CLOSE cur1;
END;