問題的聲明如下:這個SQL代碼如何消除排列得到改善?
-One與結構的表INIT
(number1 INT not null, number2 INT not null, ..., number7 INT not null)
-I要插入到表「標籤」表INIT的所有行,但我不知道想要 在'tab'中有兩行,這樣一個是另一個的排列。因此,舉例來說,如果(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中的一行,I對它進行排序(1,2,3,6,7,19,21)並檢查它是否在'aux'中。如果是 我繼續下一行。否則,我在'tab'中插入(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)
不知道波西米亞的解決方案將如何工作(也不懷疑它),但問題......每一行都可以重複任何數字嗎? – DRapp 2012-04-20 01:25:20
你的INIT表是否有主鍵? – 2012-04-20 01:33:53
我編輯了我的消息。是的,INIT表有一個主鍵(所有列),並且每個單一行都不能重複。 – user1261701 2012-04-20 01:43:31