問題の文は以下の通りです:このSQLコードは、置換を排除するためにどのように改善できますか?
-One構造を持つテーブルのINITを持っている
-Iは、表に「タブ」テーブルのINITのすべての行を挿入したい(number1 INT not null, number2 INT not null, ..., number7 INT not null)
が、私にはありません に2つの行を 'tab'に入れて、一方がもう一方の順列になるようにします。したがって、たとえば、 (1,2,3,7,19,21,6)および(19,2,3,7,1,21,6)がINITの行である場合は、1つだけ それらは「タブ」に終わらなければならない。それらのどれが「タブ」で終わるかは問題ではありません。
- 次のコードは次のとおりです。補助テーブル 'aux'を INITと同じ構造にしています。私はテーブルINITのすべての行を繰り返し、各行に対して をINITで並べ替えます。そのため、(1,2,3,7,19,21,6)が INITの行であれば、それを並べ替え(1,2,3,6,7,19,21)、それが 'aux'に入っているかどうか確認してください。 の場合は次の行に進みます。それ以外の場合は、「タブ」に(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の -In各行を、すべての整数が異なっています。 - INITの主キーは(数字1、数字2、...、数字7)
(どちらかそれを疑うない)ボヘミアンのソリューションが動作する方法をよく知ってはいけません、質問は...いずれかの数字を1行ごとに繰り返すことができますか? – DRapp
INITテーブルに主キーがありますか? –
私のメッセージを編集しました。はい、INITテーブルにはプライマリキー(すべてのカラム)があり、1行につき番号を繰り返すことはできません。 – user1261701