关于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呢?

谢谢!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐