暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

INDEX UNIQUE SCAN 逻辑读高诊断案例

原创 范计杰 2021-06-04
979

反馈OGG 同步延迟高,检查正在做DELETE操作,执行计划是INDEX UNIQUE SCAN,单次执行3-4秒,逻辑读50万以上,为什么?

活动回话

USERNAME          SID EVENT                MACHINE    MODULE               STATUS   LAST_CALL_ET SQL_ID          WAI_SECINW ROW_WAIT_OBJ# SQLTEXT                        BS          CH# OSUSER     HEX

---------- ---------- -------------------- ---------- -------------------- -------- ------------ --------------- ---------- ------------- ------------------------------ ---------- ---- ---------- ---------
GGS               747 On CPU / runqueue    appmac1   OGG-OPEN_DATA_USER1URCE ACTIVE              4 950u3c3mdtpnu   -1:4                  -1 DELETE FROM "USER1"."ORDER_ITEM"  :             3 oracle       1000b92
....
28 rows selected.

执行计划

SQL_ID  950u3c3mdtpnu, child number 0
-------------------------------------

DELETE FROM "USER1"."ORDER_ITEM"  WHERE "ORDER_ITEM_ID" = :b0

Plan hash value: 583971486

-----------------------------------------------------

| Id  | Operation          | Name          | E-Rows |
-----------------------------------------------------

|   0 | DELETE STATEMENT   |               |        |
|   1 |  DELETE            | ORDER_ITEM    |        |
|*  2 |   INDEX UNIQUE SCAN| PK_ORDER_ITEM |      1 |
-----------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("ORDER_ITEM_ID"=TO_NUMBER(:B0))

SQL历史执行情况

DELETE INDEX UNIQUE SCAN,逻辑读53万

SQL> @sql_hist
Enter the SQL_ID: 950u3c3mdtpnu
Enter number of days (backwards from this hour) to report (default: ALL): 10
+--------------------------------------------------------------------------------------------------+
|Plan HV     Min Snap  Max Snap  Execs       LIO            PIO            CPU         Elapsed     |
+--------------------------------------------------------------------------------------------------+
|583971486   16464     16481     2,778       1,525,274,299  584,903        10,769.35   11,128.47   |
+--------------------------------------------------------------------------------------------------+
.
========== PHV = 583971486==========
First seen from "06/03/21 20:00:07" (snap #16464)
Last seen from  "06/04/21 13:00:00" (snap #16481)
.
Execs          LIO            PIO            CPU            Elapsed
=====          ===            ===            ===            =======
2,778          1,525,274,299  584,903        10,769.35      11,128.47
.
Plan hash value: 583971486

------------------------------------------------------------------------------------

| Id  | Operation          | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------

|   0 | DELETE STATEMENT   |               |       |       |     1 (100)|          |
|   1 |  DELETE            | ORDER_ITEM    |       |       |            |          |

|   2 |   INDEX UNIQUE SCAN| PK_ORDER_ITEM |     1 |    73 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------



                                              Per-Plan Execution Statistics Over Time
                                                                                                         Avg                 Avg
      Plan Snapshot                                          Avg LIO             Avg PIO          CPU (secs)      Elapsed (secs)

Hash Value Time         INSTANCE_NUMBER    Execs            Per Exec            Per Exec            Per Exec            Per Exec

---------- ------------ --------------- -------- ------------------- ------------------- ------------------- -------------------

 583971486 03-JUN 20:00               1       32          537,065.94           16,776.84                5.57               15.25
           04-JUN 10:00               1      177          534,541.33              262.29                3.88                4.04
           04-JUN 11:00               1      884          537,321.73                0.70                3.79                3.80
           04-JUN 12:00               1      804          578,415.14                0.81                4.03                4.04
           04-JUN 13:00               1      881          537,385.01                0.40                3.76                3.77
**********                              -------- ------------------- ------------------- ------------------- -------------------
avg                                                       544,945.83            3,408.21                4.21                6.18
sum                                        2,778

CALL STACK

INDEX UNIQUE SCAN,逻辑读53万,不正常查看call stack

SQL> oradebug setospid 218559
Oracle pid: 1458, Unix process pid: 218559, image: oracle@appmac1
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+200<-__sighandler()<-kdstf110010100001000km()+744<-kdsttgr()+2160<-qertbFetch()+1089<-qergsFetch()+739<-opifch2()+3206<-opifch()+61<-opiodr()+1202<-rpidrus()+198<-skgmstack()+65<-rpidru()+132<-rpiswu2()+541<-rpidrv()+1248<-rpifch()+49<-kxccres()+2719<-delrefc()+745<-delref()+493<-delrow()+6130<-qerdlDelRow()+508<-qerdlFetch()+368<-delexe()+1179<-opiexe()+11864<-opiodr()+1202<-ttcpip()+1222<-opitsk()+1897<-opiino()+936<-opiodr()+1202<-opidrv()+1094<-sou2o()+165<-opimai_real()+422<-ssthrdmain()+417<-main()+256<-__libc_start_main()+245
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+200<-__sighandler()<-kcbgtcr()+483<-ktrget2()+877<-kdst_fetch0()+738<-kdstf110010100001000km()+10037<-kdsttgr()+2160<-qertbFetch()+1089<-qergsFetch()+739<-opifch2()+3206<-opifch()+61<-opiodr()+1202<-rpidrus()+198<-skgmstack()+65<-rpidru()+132<-rpiswu2()+541<-rpidrv()+1248<-rpifch()+49<-kxccres()+2719<-delrefc()+745<-delref()+493<-delrow()+6130<-qerdlDelRow()+508<-qerdlFetch()+368<-delexe()+1179<-opiexe()+11864<-opiodr()+1202<-ttcpip()+1222<-opitsk()+1897<-opiino()+936<-opiodr()+1202<-opidrv()+1094<-sou2o()+165<-opimai_real()+422<-ssthrdmain()+417<-main()+256<-__libc_start_main()+245
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+200<-__sighandler()<-kdstf110010100001000km()+744<-kdsttgr()+2160<-qertbFetch()+1089<-qergsFetch()+739<-opifch2()+3206<-opifch()+61<-opiodr()+1202<-rpidrus()+198<-skgmstack()+65<-rpidru()+132<-rpiswu2()+541<-rpidrv()+1248<-rpifch()+49<-kxccres()+2719<-delrefc()+745<-delref()+493<-delrow()+6130<-qerdlDelRow()+508<-qerdlFetch()+368<-delexe()+1179<-opiexe()+11864<-opiodr()+1202<-ttcpip()+1222<-opitsk()+1897<-opiino()+936<-opiodr()+1202<-opidrv()+1094<-sou2o()+165<-opimai_real()+422<-ssthrdmain()+417<-main()+256<-__libc_start_main()+245
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+200<-__sighandler()<-ktrvac()+93<-kcbz_exec_ckf_debug()+35<-ktrget2()+944<-kdst_fetch0()+738<-kdstf110010100001000km()+10037<-kdsttgr()+2160<-qertbFetch()+1089<-qergsFetch()+739<-opifch2()+3206<-opifch()+61<-opiodr()+1202<-rpidrus()+198<-skgmstack()+65<-rpidru()+132<-rpiswu2()+541<-rpidrv()+1248<-rpifch()+49<-kxccres()+2719<-delrefc()+745<-delref()+493<-delrow()+6130<-qerdlDelRow()+508<-qerdlFetch()+368<-delexe()+1179<-opiexe()+11864<-opiodr()+1202<-ttcpip()+1222<-opitsk()+1897<-opiino()+936<-opiodr()+1202<-opidrv()+1094<-sou2o()+165<-opimai_real()+422<-ssthrdmain()+417<-main()+256<-__libc_start_main()+245

重点函数

ktrget
kernel transaction read consistency get a read consistent block

kdsttgr
kernel data seek/scan table full table scan

rpidru
recursive program interface setup memory for recursive session

rpiswu2
recursive program interface switch user in recursive sql


rpidrv
recursive program interface recursive program interface driver

call stack看存在递归调用

检查无触发器

SQL> select owner,trigger_name from dba_triggers where table_name=‘ORDER_ITEM’;

no rows selected

检查存在外键

set lines 999
col owner for a10
col constraint_name for a30
col table_name for a30
col column_name for a30
col column_name for a30
col R_CONSTRAINT_NAME for a30
select a.OWNER,a.constraint_name,
b.table_name,
b.column_name,A.R_CONSTRAINT_NAME  from dba_constraints a,dba_cons_columns b WHERE  a.CONSTRAINT_TYPE='R' AND A.CONSTRAINT_NAME=B.constraint_name
and A.R_CONSTRAINT_NAME='PK_ORDER_ITEM';

SQL> set lines 999
SQL> col owner for a10
SQL> col constraint_name for a30
SQL> col table_name for a30
SQL> col column_name for a30
SQL> col column_name for a30
SQL> col R_CONSTRAINT_NAME for a30
SQL> select a.OWNER,a.constraint_name,
  2  b.table_name,
  3  b.column_name,A.R_CONSTRAINT_NAME  from dba_constraints a,dba_cons_columns b WHERE  a.CONSTRAINT_TYPE='R' AND A.CONSTRAINT_NAME=B.constraint_name
  4  and A.R_CONSTRAINT_NAME='PK_ORDER_ITEM';

OWNER      CONSTRAINT_NAME                TABLE_NAME                     COLUMN_NAME                    R_CONSTRAINT_NAME

---------- ------------------------------ ------------------------------ ------------------------------ ------------------------------

USER1         FK_ORDER_AU_REFERENCE_ORDER_IT ORDER_AUTH                     ORDER_ITEM_ID                  PK_ORDER_ITEM
USER1         FK_ORDER_AU_REFERENCE_ORDER_IT                                ORDER_ITEM_ID                  PK_ORDER_ITEM

2 rows selected.


DELETE 的表ORDER_ITEM,被ORDER_AUTH表上的外键FK_ORDER_AU_REFERENCE_ORDER_IT引用,
子表无索引,删除主表记录时,子表会全扫

SQL> @ind so.ORDER_AUTH
Display indexes where table or index name matches %so.ORDER_AUTH%...

TABLE_OWNER          TABLE_NAME                     INDEX_NAME                     POS# COLUMN_NAME                    DSC

-------------------- ------------------------------ ------------------------------ ---- ------------------------------ ----

USER1                   ORDER_AUTH                  IDX_ORDER_AUTH_AC                 1 AUTH_CUST_ID
                                                                                      2 AUTH_CUST_TYPE
                                                    IDX_ORDER_AUTH_COI                1 CUST_ORDER_ID
                                                    PK_ORDER_AUTH                     1 ORDER_AUTH_ID


INDEX_OWNER          TABLE_NAME                     INDEX_NAME                     IDXTYPE    UNIQ STATUS   PART TEMP  H     LFBLKS           NDK   NUM_ROWS       CLUF LAST_ANALYZED     DEGREE VISIBILIT

-------------------- ------------------------------ ------------------------------ ---------- ---- -------- ---- ---- -- ---------- ------------- ---------- ---------- ----------------- ------ ---------

USER1                ORDER_AUTH                     IDX_ORDER_AUTH_AC              NORMAL     NO   VALID    NO   N     3      85558       7835352   23190775   14772763 20210424 19:21:03 1      VISIBLE
                     ORDER_AUTH                     IDX_ORDER_AUTH_COI             NORMAL     NO   VALID    NO   N     3      77535      14889984   23190830   13338813 20210424 19:22:13 1      VISIBLE
                     ORDER_AUTH                     PK_ORDER_AUTH                  NORMAL     YES  VALID    NO   N     3      77315      23190867   23190867   13387299 20210424 19:23:16 1      VISIBLE

SQL> @seg so.ORDER_AUTH

    SEG_MB OWNER                SEGMENT_NAME                   SEG_PART_NAME                  SEGMENT_TYPE         SEG_TABLESPACE_NAME                BLOCKS     HDRFIL     HDRBLK

---------- -------------------- ------------------------------ ------------------------------ -------------------- ------------------------------ ---------- ---------- ----------

      4215 USER1                                                                       TABLE                TBS_USER1                             539520        136       1738

1 row selected.

解决方法

在USER1.ORDER_AUTH上外键引用的列ORDER_ITEM_ID上,创建索引

最后修改时间:2021-06-04 17:31:56
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论