20张表每张表都有保单号。每张表数据不一样。有大有小。大的可能5、6千万以上。如果快速把所有表的保单生成一张表。要性能
解决方案 »
- oracle学习书籍推荐
- oracle 9i 用户没有权限查看表
- 如何在安装程序后而无需安装Oracle客户端
- Oracle Http Server启动不正常的问题!
- wangybyangxr(王永斌) 请进来领分
- 哪位高手能细讲一下数据的导入导出
- 创建数据库创建到一半的时候就报错,不知道是什么原因,请大家帮忙!!!
- 帮助帮助我啊~~~~~~~~~~~~~~!其他论坛的人都回答不了啊~!?我该怎么做啊~?谢谢了啊
- 怎样一次性去除 名称字段里的 全角空格
- Oracle如何实现用户A自动拥有对用户B所有对象的查询权限
- oracle spatial数据同步
- 将excel的日期导入到sqldeveloper中格式是什么
简单的语句就是create table tmp
as
select 保单
from(select 保单 from tab1
union select 保单 from tab2
......
......
union select 保单 from tab20
)tmp担心性能问题,希望能有一个好的解决办法。
2、是这20张表其实重复率很高,很可能三张表就已经包含所有保单了。更希望是能找到一个种更好的办法实现
SQL本身是什么SQL?
因为union内部需要排序,20张5千万的表加在一起排序挺恐怖的
create table tmp
as
select 保单 from tab1
union all select 保单 from tab2
......
......
union all select 保单 from tab20
如果要去重复 建议先建好tmp表,并给tmp表的这个字段建立 unique 索引
然后依次插入各表的数据insert into tmp select 保单 from tab1 where not exists(select 1 from tmp where tmp.保单 = tab1.保单);
insert into tmp select 保单 from tab2 where not exists(select 1 from tmp where tmp.保单 = tab2保单);
insert into tmp select 保单 from tab3 where not exists(select 1 from tmp where tmp.保单 = tab3.保单);
...
insert into tmp select 保单 from tab20 where not exists(select 1 from tmp where tmp.保单 = tab20.保单);
此外 可以试试 insert /*+APPEND*/ into ……
你的union ,排序最快的复杂度是 O(nlogn) 这里 n=1e10
有唯一索引的情况下,如你所说,3张表其实已经基本全了,那么后面17张表进行not exists运算,相当于先全表扫描然后逐一进行二分法查找 复杂度为O(17logn) 这里 n=6e8
2.插入方法有三种
(1) 如果20张表的数据量都非常少,可以使用:create table tmp
select distinct 保单号
from (
select 保单号 from tab1
union all
select 保单号 from tab2
union all
....
select 保单号 from tab20
)(2) 表数据量大的话,建议单独插入:create table tmp as select 保单号 from tab1;insert into tmp values(保单号) select 保单号 from tab2;
commit;
insert into tmp values(保单号) select 保单号 from tab3;
commit;
....
insert into tmp values(保单号) select 保单号 from tab20;
commit;最后记得对tmp表的报表号作去重处理。
(3) 还可以使用存储过程,动态查询含有保单号的表、字段,使用动态SQL拼接后插入。
涉及到去重,很难达到楼主想的高效吧
如果20张表,数据重复度很高,我觉得可以直接20张表一路union下来
如果重复度不高,那就先全部union all 然后distinct吧
建表的方法除非数据量非常大,用时间换内存空间