20张表每张表都有保单号。每张表数据不一样。有大有小。大的可能5、6千万以上。如果快速把所有表的保单生成一张表。要性能

解决方案 »

  1.   

    不同的表怎么union? 性能不是针对表/视图这些对象来讲的,性能是针对程序,也就是针对SQL来讲的,可以说只有知道程序如何访问对象的情况下,才能做性能优化
      

  2.   

    不能简单的 union ,这个不现实的。首先,要实现你的需求,其次,才是性能的调整。源数据长什么样,你的结果又想要什么样,都要明确。
      

  3.   

    我需要的就是把这20张表里面所有的保单号全部生成一张临时表。因为为担心有漏掉的数据,所以所有表都要过一下。
    简单的语句就是create table tmp
    as
    select 保单
    from(select 保单 from tab1
    union select 保单 from tab2
    ......
    ......
    union select 保单 from tab20
    )tmp担心性能问题,希望能有一个好的解决办法。
      

  4.   

    1、是SQL本身的性能、这样作对数据库的压力、
    2、是这20张表其实重复率很高,很可能三张表就已经包含所有保单了。更希望是能找到一个种更好的办法实现
      

  5.   


    SQL本身是什么SQL?
      

  6.   

    如果能确保多张表中的保单号不重复,用union all 不要用union 
    因为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 ……
      

  7.   

    作20次的not exists
      

  8.   

    有唯一索引其实还好,比你20张表加起来十几亿数据排序好多了。
    你的union ,排序最快的复杂度是 O(nlogn)  这里 n=1e10
    有唯一索引的情况下,如你所说,3张表其实已经基本全了,那么后面17张表进行not exists运算,相当于先全表扫描然后逐一进行二分法查找 复杂度为O(17logn) 这里 n=6e8
      

  9.   

    1.union涉及排序操作,很影响性能。所以尽量使用union all代替union。
    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拼接后插入。
      

  10.   

    我咋觉得这个问题有点越来越歪的迹象……楼主从一开始就放出的是自己的猜测,没有实际描述自己的需求和遇到的问题,能否再详细描述一遍原始的需求和实施“union” 方案之后遭遇到的问题?
      

  11.   

    楼主应该其实就是想怎么高效的处理20张表的去重问题,楼主想用union ,想问问还有没有更好的方法,被各位夸大化了吧
    涉及到去重,很难达到楼主想的高效吧
    如果20张表,数据重复度很高,我觉得可以直接20张表一路union下来
    如果重复度不高,那就先全部union all  然后distinct吧
    建表的方法除非数据量非常大,用时间换内存空间
      

  12.   

    union应该就是最好的方式了
      

  13.   

    先去重再uniall再去重吧
      

  14.   

    如果要把数据插入到临时表,就不用UNION了,先创建空表,然后对每个表分别执行INSERT插入就可以了,插入时可以用/*+ APPEND */,后面增加NOLOGGING禁止产生日志,SELECT 后面用/*+ PARALLEL */增加并行,可以在晚上做,当然要注意UNDO表空间是否足够。