我写了一个跨库采集数据的存储过程:
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、通过游标获取源数据(测试时源数据为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多分钟又都采集回来了。
解决方案 »
- oracle pl/sql编程中,在java应用程序中给一个type对象类型赋值出错
- [斑竹手下留情,借宝地问个C#调用oracle过程的问题]C#中能调用oracle传入参数pl/sql
- 备份恢复问题。急,多谢。
- 各位,帮我解决一个问题.Oracle中存储过程如何解决,字符串的转换问题.
- 在当前所打开的游标中如何获得索包含的列数?
- 如何将这条语句写成存储过程,初来宝地散100表示敬意!
- oracle9i的odbc Driver的名称问题
- 请问在哪里设置REMOTE_LOGIN_PASSWORDFILE这个参数?
- 在OCI中怎样传递数组给PL/SQL?
- 表空间添加错误 导致数据无法入库 执行SQL异常ORA-00376: 此时无法读取文件 59
- 分享我的小工具, 把数据库中的表的数据导出到文件的例子
- oracle 查询结果集问题
表索引不能随意去加 要考虑整体的性能问题 如果提取数据的语句性能差 可以看看执行计划 从中找到解决的方法 匹配数据insert或update可以试试用merge into 或直接通过select把不存在的数据提取过来 直接用insert into 表 select * from 表;
或者insert
selectwhere no exists
也一样啊
何必用游标一条条判断呢,只是判断目标库是否已经有数据否
以ID关联insert into b
select a.*
from a
where no exists
(
select 1
from b
where a.id=b.id)
能不能将要做INSERT的数据选出后,先放在一张临时表里,然后逐行处理也是在临时表做,最后一次性insert
最好这个临时表和这些操作都是在内存中进行,一旦涉及硬盘的IO就慢了。