我正在尝试使用现有表中的数据子集创建新表。
以下是一些示例数据。该表有7000条记录:
create table numbersegment (startnum varchar(35),endnum varchar(35),id_prefix number(10));
insert into numbersegment values('8175290000','8175299999','14108');
insert into numbersegment values('8175300000','8175309999','14108');
insert into numbersegment values('8175310000','8175319999','14108');
insert into numbersegment values('8175320000','8175329999','14108');
insert into numbersegment values('8175330000','8175339999','14108');
User_info表有3500万条记录:
create table user_info(num varchar(35),subid number(18),custid number(18));
insert into user_info values('8175290031',100001234567891111,100001234567891111);
insert into user_info values('8175290032',100001234567891112,100001234567891112);
insert into user_info values('8175290033',100001234567891113,100001234567891113);
insert into user_info values('8175290034',100001234567891114,100001234567891114);
insert into user_info values('8175290035',100001234567891115,100001234567891115);
当我执行以下SQL时,创建客户表约需20分钟
create table customer as
select
mk.num,
nm.id_prefix||substr(mk.subid,6) new_sub_id,
nm.id_prefix||substr(mk.custid,6) new_cust_id
from user_info mk,
numbersegment nm
where mk.num >=nm.startnum
and mk.num <=nm.endnum;
请建议创建此表的最快方法。
已尝试过并行执行和Substr等匹配第一个字符的事情。
答案 0 :(得分:2)
答案 1 :(得分:0)
选择很慢,因为user_info表的基数是笛卡儿积,其中带有带子句的numbersegment表。
where mk.num >=nm.startnum
and mk.num <=nm.endnum;
并且你在两个表上都有一个FULL TABLE SCAN。
性能的一个可能的增强包括在user_info.num列上创建索引,如果您还没有。
create index USER_INFO_I1 on user_info (num);
如果你不能这样做,你可以将user_info表复制到另一个表中并在之后创建索引已经填充了user_info克隆表(否则每次插入都会发生索引重新计算)在表中会破坏你的表现。)
另一项效果增强功能可能是将字段user_info.num
,numbersegment.startnum
和numbersegment.endnum
转换为NUMBER
数据类型(如果它们是数字,当然,因为它们来自您的例子)。
还有字段
numbersegment.id_prefix, user_info.subid, user_info.cust_id
应该在VARCHAR2中进行转换,因为它们从您的查询中看起来
nm.id_prefix||substr(mk.subid,6) new_sub_id,
nm.id_prefix||substr(mk.custid,6) new_cust_id
但这不是性能提升