Insert into Select 语句优化 本帖最后由 mvsean 于 2009-10-15 09:25:06 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我试着跑了3个月的数据,Oracle 给出的顺序是 1.CTF_INDEX1 INDEX(RANGE SCAN) 2.CTF TABLE ACCESS(BY INDEX ROWID) 3.SORT(GROUP BY) 4.INsert 执行时间3小时,3个月的数据。 用EXPLAIN PLAN 分析下,看看cost是多少..建议:1.用Hint 提示减少操作时间 INSERT /*+Append*/ INTO tab1 SELECT * FROM tab2;2. 采用不写日志及使用Hint提示减少数据操作的时间。建议方案是先修改表为不写日志: sql> alter table table_name NOLOGGING; 插入数据:INSERT /*+Append*/ INTO tab1 SELECT * FROM tab2;插入完数据后,再修改表写日志: sql> alter table table_name LOGGING; 这里的区别就在于如果插入数据的同时又写日志,尤其是大数据量的insert操作,需要耗费较长的时间。3. 在相关列上建索引, 注意,如果code列上有索引,code <> '000000000000000' 将会限制索引,应改成code < '000000000000000' and code > '000000000000000' insert 的时候,你可以看一下执行计划..... 非常感谢,我来按前辈说的来做。 关于第三点,我也曾看文章中提到过, <> 会限制索引, >= <= 也会限制索引么?我当时看到文章中提到后自己试过,就 select * from 而言,当时感觉不到 <> 有限制索引。今天你再次提到,我又测了下,确实在 count() sum() 聚集的时候,有明显的差异。 对于此sqlcode <> '000000000000000' And getdate >= '20080101' And getdate <= '20081231' ,做如下优化:1,将code <> '000000000000000' 换成 code in ('000000000000000')2,将getdate >= '20080101' 换成 getdate > '20071231' 3,将getdate <= '20081231' 换成 getdate < '20090101' 你把这历史数据的执行可以做个JOB放到半夜去执行 7楼的sql语句优化方案比较完整 关于 order by 子句里面用到 case when 的例子 oralce的访问其他数据库的表 materialize问题 急啊,快来解决以下咯 这个sql问题如何写 求如何把日期转化为""yyyy-mm-dd hh:mm:ss"格式? 我用8IAS做WEB开发,使用UTL_FILE包写入文件的时候,为什么是乱码?请问如何解决?谢谢 如何查看那些用户锁定了那些表和行,以及该用户正在执行的SQL语句? ★★★各位大虾,A,B,C三个表的左连接怎么查询,假定A表为主表 C++Builder调用ORACLE存储过程问题,高分求教!!紧急!! 急求一个复杂SQL查询语句! ql/sql编程
2.CTF TABLE ACCESS(BY INDEX ROWID)
3.SORT(GROUP BY)
4.INsert
执行时间3小时,3个月的数据。
用EXPLAIN PLAN 分析下,看看cost是多少..建议:
1.用Hint 提示减少操作时间
INSERT /*+Append*/ INTO tab1
SELECT * FROM tab2;2. 采用不写日志及使用Hint提示减少数据操作的时间。
建议方案是先修改表为不写日志:
sql> alter table table_name NOLOGGING;
插入数据:
INSERT /*+Append*/ INTO tab1
SELECT * FROM tab2;
插入完数据后,再修改表写日志:
sql> alter table table_name LOGGING;
这里的区别就在于如果插入数据的同时又写日志,尤其是大数据量的insert操作,需要耗费较长的时间。3. 在相关列上建索引, 注意,如果code列上有索引,code <> '000000000000000' 将会限制索引,应改成code < '000000000000000' and code > '000000000000000'
关于第三点,我也曾看文章中提到过, <> 会限制索引, >= <= 也会限制索引么?
我当时看到文章中提到后自己试过,就 select * from 而言,当时感觉不到 <> 有限制索引。
今天你再次提到,我又测了下,确实在 count() sum() 聚集的时候,有明显的差异。