Oracle 性能优化

用如下select 统计一个月数据大概100W左右,2分钟左右可出来结果1000条左右记录,但是insert却20分钟未出来结果,请各位高手帮忙告知如何查找原因及如何改进。谢!
insert into garsal select v_salmonth,stf_cde,sum((nvl(mfo.adj_pec2@hfdb(a.tkt_pfx,a.tkt_dat),100)/100)*mfo.dir_lbr@hfdb(a.tkt_pfx,a.tkt_sfx,a.tkt_dat)*a.tkt_qty) salary from mfotktout@hfdb a where a.tkt_dat>=v_start_date
and a.tkt_dat<=v_end_date
group by v_salmonth,a.stf_cde;
CREATE TABLE GARSAL
(
SALMONTH VARCHAR2(10 BYTE),
STAFF VARCHAR2(10 BYTE),
SALARY NUMBER
)

CREATE INDEX GARSALIDX1 ON GARSAL
(SALMONTH, STAFF)
NOPARALLEL;
garsal表只有一个索引,没有触发器,记录5851 ,试过删除索引问题任然存在,还试过create table t1[nologging] as 效果一样,40分钟没有出来结果
谢谢ocen713 ,因为是从远程资料库做链接,所以要加@,这个是我的资料库链接,我用for (select ...) loop 在5分钟内可以完成,sql照理也没有问题 ,还有我的sql语句没有排序order by 只有分组group by

尝试下下面的方法;
1、测试你create table xx nologging as select 所有结果集所用的时间,如果这个时间在你可接受的范围之内的话,你就分两步进行 先创建这表,然后从这个表插入到你想要的表里面
2、如果创建表的时间很短,但是插入的时间很长,应该是数据库的临时表空间太小了(lz的select的语句需要排序会需要很多表空间的)解决的办法是增加临时表空间;当然如果没有条件的话,就对于xx表在生成的时候增加一个字段根据rownum分组 比如 1-5000条这个字段是1 5001-10000这个字段是2 ,然后写一个存储过程根据这个字段的值 分批次插入,好处是分批次提交,减少临时表空间的占用,也可以解决假死的问题;

那这个问题就是select语句的问题了,只能从sql语句上优化下了

select 语句的话 mfo.dir_lbr@hfdb 这个你是通过DBlink去访问远程数据库吗 为什么都要加@

如果是远程访问的话 建议可以对这几张表在远程做一个视图(可以是查询结果集的视图),然后这边只要查询这个视图,应该会快点,注意远程视图是用不到索引的
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-07-22
版本?空间?
第2个回答  2010-07-20
先删掉索引,再insert
第3个回答  2010-07-21
你的数据库太大了吧 建议你建立个视图,这样查询要快点
相似回答