索引本来就会降低插入和更新的速度,你只能具体分析你的SQL语句了.
先做一个查询计划,有可能的话把复合索引拆分.
解决方案 »
- 为什么在pl/sql执行插入一个特定值时,语句就一直在执行中;而插入类似值就没问题
- oracle Fatal NI connect error 12170.错误
- 如何读取某一天二十四小时的数据
- Linux ES4 下 Oracle9i 装后,如何让系统启动时,自动运行.
- 大哥们,小弟一条sql不会写 哪位朋友帮看下啊
- oracle如何向表导入制表符格式文本?
- 如何清空v$sql表中的记录?
- 如何对指定月的月份进行按日统计
- oracle9哪里有什么资料啊,基础的操作资料啊!
- 想从存储过程中 得到一个结果集的一个值并赋值给变量
- 四个问题,请大家出手帮忙
- ORACLE里不能用LEFT语句吗?帮我看看
正式表temp1有COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8 几个字段
COL1,COL2,COL3,COL4,COL5为联合主键,COL6为待更新的字段,COL6,COL7,COL8 都有缺省值,正式表可能有四五十万条记录。临时表temp2 COL1,COL2,COL3,COL4,COL5,COL6 几个字段
正常情况下临时表有几百条记录,特殊情况下可能有几万条记录。
现在要把临时表的数据插入或更新到正式表中。
现在的写法
插入
insert into temp1 (COL1,COL2,COL3,COL4,COL5,COL6)
select COL1,COL2,COL3,COL4,COL5,COL6 from temp2 a where not exists (select 1 from temp1 where COL1=a.COL1 and COL2=a.COL2 and COL3=a.COL3 and COL4=a.COL4 and COL5=a.COL5)
更新
update temp1 a set COL6=(select COL6 from temp2 where COL1=a.COL1 and COL2=a.COL2 and COL3=a.COL3 and COL4=a.COL4 and COL5=a.COL5) where exist (select 1 from temp2 where COL1=a.COL1 and COL2=a.COL2 and COL3=a.COL3 and COL4=a.COL4 and COL5=a.COL5)
按这种写法程序得执行几个小时才能执行完。
如何优化SQL语句,或者从数据结构上如何优化?
1.看看 select 1 from temp1 where COL1=a.COL1 and COL2=a.COL2 and COL3=a.COL3 and COL4=a.COL4 and COL5=a.COL5) 花了多少时间,具体的查询计划. 2. 加上NOT exist 关键字后,再看看整个子查询花了多少时间 3. 使用DirectPath,先禁用目标表上的索引维护
alter index ix_temp1(temp1表上的索引名称) unusable;
alter session set skip_unusable_indexes=true;
insert /*+ append */ into temp1 ... 4. 如果以上的方法还不能提高效率的话,建议装一个lecco sql expert
for oracle,或许这个软件会给你一个优化的SQL方案.