oracle中sql建立索引调优,关于update的SQL调优,怎样才能让update语句走索引??
关于update的SQL调优,怎样才能让update语句走索引??批量更新一个表,根据执行计划得到的是:全表扫描。尽管已经建立索引列。测试过程SQL> desc dfj_test2NameNull?Type----------------------------------------- -------- -...
关于update的SQL调优,怎样才能让update语句走索引??
批量更新一个表,根据执行计划得到的是:全表扫描。尽管已经建立索引列。
测试过程
SQL> desc dfj_test2
Name Null? Type
----------------------------------------- -------- ----------------------------
CITYCD VARCHAR2(10)
BRHID VARCHAR2(15)
ACCNO VARCHAR2(10)
CURNO VARCHAR2(20)
JOBTP VARCHAR2(20)
PERIMON VARCHAR2(10)
CUSTMGR VARCHAR2(10)
TXNYM VARCHAR2(20)
ACTCNT NUMBER
ACTBAL NUMBER
FINA_BANK VARCHAR2(10)
FINA_DEPT VARCHAR2(20)
FINA_PROD VARCHAR2(10)
FINA_CUSTMGR VARCHAR2(20)
FINA_PERIOD VARCHAR2(20)
STATUS VARCHAR2(240)
REMARK VARCHAR2(100)
ATTRIBUTE1 VARCHAR2(240)
ATTRIBUTE2 VARCHAR2(240)
ATTRIBUTE3 VARCHAR2(240)
ATTRIBUTE4 VARCHAR2(240)
ATTRIBUTE5 VARCHAR2(240)
SQL> create index dfj_test2_idx on dfj_test2(citycd);
Index created.
SQL> create index dfj_test2_idx2 on dfj_test2(citycd,accno,curno,jobtp,perimon);
Index created.
-- 可以看到索引已经生效了:
SQL> select count(*)
2 from dfj_test2
3 where citycd='905'and accno='2111' and curno=01;
COUNT(*)
----------
939
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'DFJ_TEST2'
3 2 INDEX (RANGE SCAN) OF 'DFJ_TEST2_IDX' (NON-UNIQUE)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
25 consistent gets
0 physical reads
0 redo size
210 bytes sent via SQL*Net to client
276 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
但是为什么这条UPDATE语句不走索引呢??
SQL> update dfj_test2 aa
2 set fina_custmgr =nvl((select bb.fina_custmgr
3 from dfj_test3 bb
4 where aa.custmgr=bb.custmgr
5 ),'111111111')
6 where aa.citycd=905;
2091 rows updated.
Execution Plan
----------------------------------------------------------
0 UPDATE STATEMENT Optimizer=CHOOSE
1 0 UPDATE OF 'DFJ_TEST2'
2 1 TABLE ACCESS (FULL) OF 'DFJ_TEST2'
3 1 TABLE ACCESS (FULL) OF 'DFJ_TEST3'
Statistics
----------------------------------------------------------
176 recursive calls
2147 db block gets
6375 consistent gets
5 physical reads
581488 redo size
371 bytes sent via SQL*Net to client
486 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
4 sorts (memory)
0 sorts (disk)
2091 rows processed
问题: 1:如何使其走索引??
2:可以看到产生了很多的redo,又没有办法不产生这么多redo呢?
谢谢!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)