一张表A,字段有id...rq,其中rq是date字段,做个简单的查询:select* from A where id = '9' and rq between Date'2010-06-01' and Date '2010-06-19',查询速度很慢,需要1.7秒,重复执行也是如此,如果简单的把前一个'2010-06-01'改成'2009-01-01',立即速度飞快,只要0.03秒,同样的查询,日期段拉大反倒查询速度猛升,不知道究竟是什么原因,有没有大大遇到过此类问题的,望指点迷津啊
解决方案 »
- 求救:向oracle中clob字段写数据字符串过长的问题???急!急!急!
- Enterprise manager console打不开
- 关于数据库分布式设计与应用讨论?和资料
- 如何导出远程oracle数据库中的表结构
- (兼职)请一位精通Oracle的朋友,为我们的网络棋牌游戏程序建立数据库和日常维护和优化
- 求一巨难的sql语句
- 双机热备的服务器在磁盘阵列柜中装ORACLE,切换服务器主机时Oracle数据库无法打开
- 请教Oracle9i在solaris下的安装
- 急!!!!!如何我在MS sqlserver中建的所有表全部倒到oracle中,希望大家指点,包括默认值,关联
- oracle8里,删除字段用什么SQL语句?
- 求一oracle 語句--列出某年某月某旬的所有天數
- oracle中 如何查询10天前的数据
看看两个sql的执行计划是否相同?会不会走了不同的路线?
--试试这样看看执行计划
select * from A
where id = '9' and rq >=Date'2010-06-01' and rq<=Date '2010-06-19'
sql 如下:
select sum(sj_je) as zj from a, b where
a.pz_xh = b.pz_xh and a.yzmx_xh = b.yzmx_xh and a.swglm in (select swglm from
c where glqy_dm = '3209243903') and a.zf_bj = 0 and a.sf_bj = '0' and b.sb_rq
between Date '2010-01-01' and Date '2010-06-11' and rk_rq is not null
//选择日期离得远的,速度快的查询,用的是nested loop,先走的是T_DJ_JGNSR,然后T_ZS_JKMX,T_ZS_YZMX
SELECT STATEMENT, GOAL = CHOOSE 22705 1 149 CHOOSE
SORT AGGREGATE 1 149
NESTED LOOPS 22705 2 298
NESTED LOOPS 22378 109 10137
TABLE ACCESS BY GLOBAL INDEX ROWID DB_DJGL T_DJ_JGNSR 469 67 1407 6 ANALYZED
INDEX RANGE SCAN DB_DJGL I_DJ_JGNSR_GLQY 7 1328 ANALYZED 1
PARTITION RANGE ALL
TABLE ACCESS BY LOCAL INDEX ROWID DB_SBZS T_ZS_JKMX 327 2 144 5 ANALYZED
INDEX RANGE SCAN DB_SBZS I_ZS_JKMX_SWGLM 31 129 ANALYZED 1
TABLE ACCESS BY GLOBAL INDEX ROWID DB_SBZS T_ZS_YZMX 3 1280912 71731072 4 ANALYZED
INDEX UNIQUE SCAN DB_SBZS PK_T_ZS_YZMX 2 53 ANALYZED 2 //选择日期靠近的,速度慢的查询,用的是hash join,先走的是T_ZS_JKMX,然后T_DJ_JGNSR,T_ZS_YZMX
SELECT STATEMENT, GOAL = CHOOSE 22482 1 149 CHOOSE
SORT AGGREGATE 1 149
HASH JOIN 22482 1 149
TABLE ACCESS BY LOCAL INDEX ROWID DB_SBZS T_ZS_JKMX 327 1 72 5 ANALYZED
NESTED LOOPS 22378 109 10137
TABLE ACCESS BY GLOBAL INDEX ROWID DB_DJGL T_DJ_JGNSR 469 67 1407 6 ANALYZED
INDEX RANGE SCAN DB_DJGL I_DJ_JGNSR_GLQY 7 1328 ANALYZED 1
PARTITION RANGE ALL
INDEX RANGE SCAN DB_SBZS I_ZS_JKMX_SWGLM 31 129 ANALYZED 1
PARTITION RANGE ALL
TABLE ACCESS BY LOCAL INDEX ROWID DB_SBZS T_ZS_YZMX 103 675 37800 4 ANALYZED
INDEX RANGE SCAN DB_SBZS I_ZS_YZMX_SBRQ 31 101226 ANALYZED 2可以看到,速度慢的查询虽然会用到I_ZS_YZMX_SBRQ这个日期索引,但是我的表是T_DJ_JGNSR最小,只有2万多,其他两个都是缴款明细,百万级的表。所以反倒走nested loop最快,现在问题来了,怎么样强制上面的sql查询走nested loops