问题陈述如下:
-一个有一个带有结构的表INIT
(number1 INT not null, number2 INT not null, ..., number7 INT not null)
- 我想将表 INIT 的所有行插入到表“选项卡”中,但我不想在“选项卡”中有 2 行,这样一个是另一个的排列。因此,例如,如果 (1,2,3,7,19,21,6) 和 (19,2,3,7,1,21,6) 是 INIT 中的行,那么其中只有一个具有最终出现在“标签”中。它们中的哪一个最终出现在“选项卡”中并不重要。
- 我下面的代码的作用如下:我保留了一个与 INIT 结构相同的辅助表“aux”。我遍历表 INIT 的所有行,对于 INIT 中的每一行,我按其组件的递增顺序对其进行排序,因此如果 (1,2,3,7,19,21,6) 是 INIT 中的一行,我对其进行排序(1,2,3,6,7,19,21) 并检查它是否在“辅助”中。如果是我继续下一行。否则,我在“选项卡”中插入 (1,2,3,7,19,21,6)。
我在包含 300,000 行的表 INIT 上运行了这个过程,我估计它需要超过 7 个小时才能运行。我想知道如何提高此程序的运行时间。
DECLARE done BOOLEAN default 0;
DECLARE n1,n2,n3,n4,n5,n6,n7 INT;
DECLARE o1,o2,o3,o4,o5,o6,o7 INT;
DECLARE my_cursor cursor FOR select * from INIT;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
OPEN my_cursor;
drop table if exists aux;
create table aux(
number1 INT not null,
number2 INT not null,
number3 INT not null,
number4 INT not null,
number5 INT not null,
number6 INT not null,
number7 INT not null,
);
create table temp( number INT );
REPEAT
truncate table temp;
FETCH my_cursor INTO n1,n2,n3,n4,n5,n6,n7;
INSERT INTO temp values(n1);
INSERT INTO temp values(n2);
INSERT INTO temp values(n3);
INSERT INTO temp values(n4);
INSERT INTO temp values(n5);
INSERT INTO temp values(n6);
INSERT INTO temp values(n7);
BEGIN
DECLARE done2 BOOLEAN default 0;
DECLARE my_cursor2 cursor FOR select * from temp order by number;
OPEN my_cursor2;
FETCH my_cursor2 INTO o1;
FETCH my_cursor2 INTO o2;
FETCH my_cursor2 INTO o3;
FETCH my_cursor2 INTO o4;
FETCH my_cursor2 INTO o5;
FETCH my_cursor2 INTO o6;
FETCH my_cursor2 INTO o7;
IF NOT EXISTS (SELECT * FROM aux where number1=o1 AND number2=o2 AND number3=o3
AND number4=o4 AND number5 = o5 AND number6 = o6 AND number7=o7 )
THEN
INSERT INTO tab VALUES (n1,n2,n3,n4,n5,n6,n7);
END IF;
CLOSE my_cursor2;
END;
UNTIL done END REPEAT;
CLOSE my_cursor;
编辑: - 在 INIT 的每一行中,所有整数都是不同的。-INIT的主键是(number1,number2,...,number7)