create table语句很慢

时间:2016-11-25 03:53:34

标签: sql oracle

我正在尝试使用现有表中的数据子集创建新表。

以下是一些示例数据。该表有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等匹配第一个字符的事情。

2 个答案:

答案 0 :(得分:2)

在我看来,没有parallel的{​​{1}}会更快。

logging option

有关详情:Miscellaneous Parallel Execution Tuning Tips

答案 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.numnumbersegment.startnumnumbersegment.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

但这不是性能提升