我写了一个跨库采集数据的存储过程:
1、通过游标获取源数据(测试时源数据为5万行左右,其中需要采集的有效数据为1万条左右,也就是目标表中已经存在4万条数据)
2、先在目标表中做存在性校验(我使用的是select count(*) into variable from tablename where masterkeys=src_data)
3、然后将不存在的数据插入目标表中。
源数据放在一个跨库的视图里,取了20多个字段,目标表是一张有接近50个字段的大表,有5个主键(其中一个为顺序号,校验时不考虑),没有建立索引前整个采集过程耗费了3小时,建立索引后插入1万条有效数据用了1个小时左右,但是当没有新数据要插入的时候,只是遍历整表做存在性校验,整个过程居然只用了2分钟,请问这种情况正常么?可能是程序有漏洞吗?使用游标只做校验的操作能有这么快吗?这个反差太大了,有点接受不了啊。
P.S. 我今天删了其中的5000条数据,然后花了20多分钟又都采集回来了。

解决方案 »

  1.   

    添加索引在对select操作查询时会提高性能  但是在insert或update的时候就会影响性能  所以要找到适宜的平衡点 两面都不会有多大影响
    表索引不能随意去加 要考虑整体的性能问题  如果提取数据的语句性能差  可以看看执行计划  从中找到解决的方法 匹配数据insert或update可以试试用merge into 或直接通过select把不存在的数据提取过来 直接用insert into 表 select * from 表;
      

  2.   

    你用megre不就行了嘛
    或者insert
    selectwhere no exists
    也一样啊
    何必用游标一条条判断呢,只是判断目标库是否已经有数据否
      

  3.   

    假设源a表,目标B表
    以ID关联insert into b
    select a.*
       from a
       where no exists
    (
    select 1
       from b
       where a.id=b.id)
      

  4.   

    对于不存在的数据,在插入前要根据数据类型的不同做一些处理的,一次性insert当然快了,但是达不到我要的效果啊。megre倒是没用过。
      

  5.   

    很同意1楼、6、7楼的做法,我想你的问题肯定是出在IO频繁,
    能不能将要做INSERT的数据选出后,先放在一张临时表里,然后逐行处理也是在临时表做,最后一次性insert
    最好这个临时表和这些操作都是在内存中进行,一旦涉及硬盘的IO就慢了。