我有两张桌子tab1和tab2。tab1有39000条记录,tab2有15000条记录。tab1和tab2都有两个公共列,分别是item_number和color_code。但在tab1中,color_code可能为null,但在tab2中不是。两个表中的item_number都不为null。在tab2中,我必须从tab1插入一行(基于两列的唯一行)数据。为此,我编写了一个过程,如下所示。它将比较每一行,但耗时太长。有没有什么方法可以提高性能。先取两个游标:
CURSOR CUR_tab1 IS SELECT item_number,color_code FROM
(SELECT item_number,color_code, SNO RID ,
MIN(SNO) OVER(partition BY item_number,color_code)
MIN_RID FROM tab1 ) WHERE RID= MIN_RID;
CURSOR CUR_tab2 IS SELECT sno_2,item_number,color_code,PRIORITY FROM tab2;son、sno_2是tab1和tab2中的主键。
为了在一个表中查找记录,我使用了一个for loop。
SELECT NVL(MAX(SNO_2),0) INTO SNO_COUNT FROM tab2;
FOR CUR_tab1 IN CUR_NIIN_CAGE
LOOP
-- GET THE NIIN_CAGE_PART RECORDS DATA.
OLD_NNCGP_NIIN := CUR_tab1 .item_number;
OLD_NNCGP_HCC := CUR_tab1 .color_codeC;
IF (SNO_COUNT>0 AND OLD_NNCGP_HCC IS NOT NULL) THEN -- IF RECORDS EXISTS IN DB
FOR CUR_tab2 IN CUR_NIIN_HCC
LOOP
OLD_NIIN := CUR_tab2.item_number;
OLD_HCC := CUR_tab2.color_codeC;
NIIN_PRIORITY := CUR_tab2.PRIORITY;
IF (trim(OLD_NNCGP_NIIN) = trim(OLD_NIIN)
AND trim(OLD_NNCGP_HCC)=trim(OLD_HCC)) THEN
-- DO NOTHING
ROW_COUNT:=0;
PROCESSED :=FALSE;
EXIT;
ELSE
ROW_COUNT:=ROW_COUNT+1;
PROCESSED :=TRUE;
END IF;
END LOOP;
ELSIF (SNO_COUNT=0 AND OLD_NNCGP_HCC IS NOT NULL) THEN
PROCESSED :=TRUE;
ROW_COUNT:=ROW_COUNT+1;
END IF;
IF ( PROCESSED ) THEN
SNO_COUNT :=SNO_COUNT+1;
INSERT INTO tab2("SNO2","color_code","item_number","PRIORITY")
values (SNO_COUNT,OLD_NNCGP_HCC,OLD_NNCGP_NIIN,NULL);
COMMIT;
END IF;
PROCESSED:=FALSE;
ROW_COUNT:=0;
END LOOP;但这需要近7分钟的时间。有没有更好的方法来比较这些列?
发布于 2012-07-25 18:42:02
现在还不完全清楚你想要实现什么。基于一个或多个列值确保行的唯一性的常规方法是创建唯一索引。
alter table <table>
add constraint <constraint_name> unique (<column1>,..,<column_n>);每当您尝试插入表中已存在的列值组合的记录时,都会引发异常(DUP_VAL_ON_INDEX)。
发布于 2012-07-25 21:15:16
您的代码以痛苦的Row为基础在Row上插入记录。这就是为什么它很慢的原因。SQL是一种集合-based语言。因此,拥抱Set的快乐,并看到您的性能提高。
不幸的是,你没有发布你的整个代码示例,所以下面的细节可能是错误的,但它应该会向你展示正确的想法:
SELECT NVL(MAX(SNO_2),0) INTO SNO_COUNT FROM tab2;
INSERT INTO tab2("SNO2","color_code","item_number","PRIORITY")
select SNO_COUNT+rownum,tab1.color_codeC,tab1.item_number,NULL)
from
( select distinct tab1.color_codeC,tab1.item_number
from tab1
where not exists
( select null from tab2
where trim(tab1."color_codeC") = trim(tab2."color_codeC")
and trim(tab1."item_number") = trim(tab2."item_number") )关于你的数据模型,有几件事是不好的。
使用MAX的
https://stackoverflow.com/questions/11646978
复制相似问题