ITPub博客

首页 > 数据库 > Oracle > [20240311]sql_id=c8s65f1cuhcb1的优化.txt

[20240311]sql_id=c8s65f1cuhcb1的优化.txt

原创 Oracle 作者:lfree 时间:2024-03-12 09:56:35 0 删除 编辑

[20240311]sql_id=c8s65f1cuhcb1的优化.txt


1.环境:
SYS@127.0.0.1:9014/ywdb> @ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

2.问题分析:
SYS@127.0.0.1:9014/ywdb> @ ashtop sql_id 1=1 &day
    Total                                                                         Distinct Distinct
  Seconds     AAS %This   SQL_ID        FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps
--------- ------- ------- ------------- ------------------- ------------------- ---------- --------
    17243      .2   25% |               2024-03-07 10:59:56 2024-03-08 10:59:49          6    11988
    16006      .2   23% | c8s65f1cuhcb1 2024-03-07 10:59:56 2024-03-08 10:59:54      16003    14604
     1308      .0    2% | 327ms8chj9552 2024-03-07 11:00:03 2024-03-08 10:59:29       1308     1303
     1275      .0    2% | 0x6u28dvh18us 2024-03-08 01:40:46 2024-03-08 02:05:22       1257     1275
     1099      .0    2% | g7ytdh9mxt1s0 2024-03-07 11:01:10 2024-03-08 10:59:36        708     1087
     1048      .0    2% | fs9p5prj0hu06 2024-03-08 01:19:49 2024-03-08 01:40:45       1048     1048
--//sql_id=c8s65f1cuhcb1,以前没有这么严重,估计与我分析系统表造成的问题.

SYS@127.0.0.1:9014/ywdb> @ sql_id c8s65f1cuhcb1
--SQL_ID = c8s65f1cuhcb1
SELECT SYS.ALL_CONS_COLUMNS.COLUMN_NAME
     , SYS.ALL_CONSTRAINTS.CONSTRAINT_NAME
  FROM SYS.ALL_CONSTRAINTS
     , SYS.ALL_CONS_COLUMNS
 WHERE SYS.ALL_CONSTRAINTS.CONSTRAINT_TYPE = :"SYS_B_0"
   AND SYS.ALL_CONSTRAINTS.TABLE_NAME      = :"SYS_B_1"
   AND SYS.ALL_CONSTRAINTS.OWNER           = :"SYS_B_2"
   AND SYS.ALL_CONSTRAINTS.CONSTRAINT_NAME = SYS.ALL_CONS_COLUMNS.CONSTRAINT_NAME
   AND SYS.ALL_CONSTRAINTS.TABLE_NAME      = SYS.ALL_CONS_COLUMNS.TABLE_NAME
   AND SYS.ALL_CONSTRAINTS.OWNER           = SYS.ALL_CONS_COLUMNS.OWNER
 ORDER BY SYS.ALL_CONSTRAINTS.CONSTRAINT_NAME
     , SYS.ALL_CONS_COLUMNS.POSITION;
--//这个程序递归调用执行。
--//只要开发使用PB,就会出现大量递归调用该语句的情况,以前有人问过我如何解决。涉及到数据字典如下:
SYS@127.0.0.1:9014/ywdb> @ sqlt c8s65f1cuhcb1
OWNER                TABLE_NAME                     OT
-------------------- ------------------------------ --------------------------------------------------
SYS                  OBJ$                           SYS.OBJ$
SYS                  OBJAUTH$                       SYS.OBJAUTH$
SYS                  CCOL$                          SYS.CCOL$
SYS                  CDEF$                          SYS.CDEF$
SYS                  USER$                          SYS.USER$
SYS                  COL$                           SYS.COL$
SYS                  ATTRCOL$                       SYS.ATTRCOL$
SYS                  CON$                           SYS.CON$
8 rows selected.
--//产生的执行计划非常复杂!!我也尝试过涉及到的表自动建立建立直方图,但是还是没有效果!!

--//首先尝试使用sql profile来看看效果。测试前如下:
SYS@127.0.0.1:9014/ywdb> @ sqlhh c8s65f1cuhcb1 .1
time unit : millisecond
BEGIN_INTERVAL_TIME      INST_ID SQL_ID        PLAN_HASH_VALUE EXECUTIONS ELA_MS_PER_EXEC CPU_MS_PER_EXEC ROWS_PER_EXEC LIOS_PER_EXEC BLKRD_PER_EXEC IOW_MS_PER_EXEC  AVG_IOW_MS CLW_MS_PER_EXEC APW_MS_PER_EXEC CCW_MS_PER_EXEC
------------------- ------------ ------------- --------------- ---------- --------------- --------------- ------------- ------------- -------------- --------------- ----------- --------------- --------------- ---------------
2024-03-08 09:00:20            1 c8s65f1cuhcb1      2845309787       6181             101             100           1.0         62490              0               0         0.0               0               0               0
2024-03-08 09:00:20            2 c8s65f1cuhcb1      2845309787      10462             105             104           0.9         63465              0               0         0.0               0               0               0
2024-03-08 10:00:23            2 c8s65f1cuhcb1      2845309787       4031             107             105           1.0         64230              0               0         0.0               0               0               0
2024-03-08 10:00:23            1 c8s65f1cuhcb1      2845309787       2645             103             102           0.8         63091              0               0         0.0               0               0               0
2024-03-08 10:23:02            1 c8s65f1cuhcb1      2845309787       4354             101             100           0.8         62557              0               0         0.0               0               0               0
2024-03-08 10:23:02            2 c8s65f1cuhcb1      2845309787       6156             106             105           1.0         64238              0               0         0.0               0               0               0
--//原来的逻辑读有64XXX。使用sql profile后:

SYS@127.0.0.1:9014/ywdb> @ d_buffer c8s65f1cuhcb1 10 2
    EXECUTIONS1    BUFFER_GETS1   ELAPSED_TIME1 ROWS_PROCESSED1 每次buffer_gets    每次执行时间  平均处理记录数         INST_ID
--------------- --------------- --------------- --------------- --------------- --------------- --------------- ---------------
        5453985      3379301090    557543625124         4786043 619.60219729244 102226.83508004 .87753138301627               2

... sleep 10 , waiting ....

    EXECUTIONS2    BUFFER_GETS2   ELAPSED_TIME2 ROWS_PROCESSED2 每次buffer_gets    每次执行时间  平均处理记录数         INST_ID
--------------- --------------- --------------- --------------- --------------- --------------- --------------- ---------------
        5454011      3379306127    557543658096         4786070 619.60016710637  102226.3537965 .87753215019185               2

       执行次数   总buffer_gets      总执行时间    总处理记录数 每次buffer_gets    每次执行时间  平均处理记录数
--------------- --------------- --------------- --------------- --------------- --------------- ---------------
             26            5037           32972              27 193.73076923077 1268.1538461538 1.0384615384615
--//逻辑读19X。            

SYS@127.0.0.1:9014/ywdb> @ spext c8s65f1cuhcb1
HINT                                                                                                 NAME                 DESCRIPTION LAST_MODIFIED
---------------------------------------------------------------------------------------------------- -------------------- ----------- ------------------------------
OPT_ESTIMATE(@"SEL$A422EF13", TABLE, "X$KZSPR"@"SEL$21", SCALE_ROWS=0.232524444)                     tuning c8s65f1cuhcb1             2024-03-08 11:02:49.000000
OPT_ESTIMATE(@"SEL$16", TABLE, "O2"@"SEL$16", SCALE_ROWS=0.1160240313)                               tuning c8s65f1cuhcb1             2024-03-08 11:02:49.000000
OPT_ESTIMATE(@"SEL$16", INDEX_FILTER, "O2"@"SEL$16", "I_OBJ2", SCALE_ROWS=0.1160240313)              tuning c8s65f1cuhcb1             2024-03-08 11:02:49.000000
OPT_ESTIMATE(@"SEL$16", INDEX_FILTER, "O2"@"SEL$16", "I_OBJ5", SCALE_ROWS=0.1160240313)              tuning c8s65f1cuhcb1             2024-03-08 11:02:49.000000
OPT_ESTIMATE(@"SEL$16", INDEX_SKIP_SCAN, "O2"@"SEL$16", "I_OBJ2", SCALE_ROWS=0.1160240313)           tuning c8s65f1cuhcb1             2024-03-08 11:02:49.000000
OPT_ESTIMATE(@"SEL$16", INDEX_SKIP_SCAN, "O2"@"SEL$16", "I_OBJ1", SCALE_ROWS=0.1160240313)           tuning c8s65f1cuhcb1             2024-03-08 11:02:49.000000
..
OPT_ESTIMATE(@"SEL$804EC250", INDEX_FILTER, "O"@"SEL$15", "I_OBJ2", SCALE_ROWS=33.03524588)          tuning c8s65f1cuhcb1             2024-03-08 11:02:49.000000
OPT_ESTIMATE(@"SEL$804EC250", INDEX_FILTER, "O"@"SEL$7", "I_OBJ2", SCALE_ROWS=33.03524588)           tuning c8s65f1cuhcb1             2024-03-08 11:02:49.000000
OPTIMIZER_FEATURES_ENABLE(default)                                                                   tuning c8s65f1cuhcb1             2024-03-08 11:02:49.000000
45 rows selected.
--//使用sql profile缺省记录的并不是执行计划,而且一些统计值,实际上效果并不是很好,平均的逻辑读19X。

--//偶然的一次我发现我们其中一台机器,运行效果很高,逻辑读很少,仅仅6X-7X上下。
--//我就记录下当时执行计划的outline,一直使用它为sql profile 交换来稳定执行计划。
--//但是每次查询笔记很不方便,我都是从另外的机器抽取outline,这次单独记录下来。

--//加入如下提示看看:
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
DB_VERSION('11.2.0.4')
ALL_ROWS
OUTLINE_LEAF(@"SEL$28294604")
UNNEST(@"SEL$18")
OUTLINE_LEAF(@"SEL$A422EF13")
MERGE(@"SEL$5EC70623")
OUTLINE_LEAF(@"SEL$16")
OUTLINE_LEAF(@"SEL$F6521A81")
UNNEST(@"SEL$10")
OUTLINE_LEAF(@"SEL$5ED1C707")
MERGE(@"SEL$61262C81")
OUTLINE_LEAF(@"SEL$8")
OUTLINE_LEAF(@"SEL$6")
OUTLINE_LEAF(@"SEL$9384AC1D")
PUSH_PRED(@"SEL$804EC250" "RO"@"SEL$2" 30)
OUTLINE_LEAF(@"SEL$804EC250")
MERGE(@"SEL$1FB6C052")
MERGE(@"SEL$FF8A3B74")
OUTLINE(@"SEL$17")
OUTLINE(@"SEL$18")
OUTLINE(@"SEL$19")
OUTLINE(@"SEL$5EC70623")
MERGE(@"SEL$21")
OUTLINE(@"SEL$9")
OUTLINE(@"SEL$10")
OUTLINE(@"SEL$11")
OUTLINE(@"SEL$61262C81")
MERGE(@"SEL$13")
OUTLINE(@"SEL$5")
OUTLINE(@"SEL$804EC250")
MERGE(@"SEL$1FB6C052")
MERGE(@"SEL$FF8A3B74")
OUTLINE(@"SEL$1")
OUTLINE(@"SEL$1FB6C052")
MERGE(@"SEL$15")
OUTLINE(@"SEL$FF8A3B74")
MERGE(@"SEL$3")
MERGE(@"SEL$4")
MERGE(@"SEL$7")
OUTLINE(@"SEL$20")
OUTLINE(@"SEL$21")
OUTLINE(@"SEL$12")
OUTLINE(@"SEL$13")
OUTLINE(@"SEL$14")
OUTLINE(@"SEL$15")
OUTLINE(@"SEL$2")
OUTLINE(@"SEL$3")
OUTLINE(@"SEL$4")
OUTLINE(@"SEL$7")
INDEX_RS_ASC(@"SEL$804EC250" "U"@"SEL$14" ("USER$"."NAME"))
INDEX_SS(@"SEL$804EC250" "O"@"SEL$7" ("OBJ$"."OWNER#" "OBJ$"."NAME" "OBJ$"."NAMESPACE" "OBJ$"."REMOTEOWNER" "OBJ$"."LINKNAME"
        "OBJ$"."SUBNAME" "OBJ$"."TYPE#" "OBJ$"."SPARE3" "OBJ$"."OBJ#"))
INDEX(@"SEL$804EC250" "U"@"SEL$7" ("USER$"."USER#" "USER$"."TYPE#" "USER$"."SPARE1" "USER$"."SPARE2"))
INDEX(@"SEL$804EC250" "C"@"SEL$2" "I_COBJ#")
INDEX_RS_ASC(@"SEL$804EC250" "OC"@"SEL$2" ("CON$"."CON#"))
INDEX(@"SEL$804EC250" "U"@"SEL$3" "I_USER#")
INDEX_RS_ASC(@"SEL$804EC250" "C"@"SEL$14" ("CON$"."OWNER#" "CON$"."NAME"))
INDEX_RS_ASC(@"SEL$804EC250" "RC"@"SEL$2" ("CON$"."CON#"))
INDEX_RS_ASC(@"SEL$804EC250" "CD"@"SEL$14" ("CDEF$"."CON#"))
INDEX(@"SEL$804EC250" "OI"@"SEL$2" ("OBJ$"."OBJ#" "OBJ$"."OWNER#" "OBJ$"."TYPE#"))
INDEX(@"SEL$804EC250" "U"@"SEL$4" ("USER$"."USER#" "USER$"."TYPE#" "USER$"."SPARE1" "USER$"."SPARE2"))
INDEX(@"SEL$804EC250" "UI"@"SEL$2" ("USER$"."USER#" "USER$"."TYPE#" "USER$"."SPARE1" "USER$"."SPARE2"))
NO_ACCESS(@"SEL$804EC250" "RO"@"SEL$2")
INDEX_RS_ASC(@"SEL$804EC250" "CC"@"SEL$14" ("CCOL$"."CON#" "CCOL$"."COL#"))
INDEX_RS_ASC(@"SEL$804EC250" "O"@"SEL$15" ("OBJ$"."OBJ#" "OBJ$"."OWNER#" "OBJ$"."TYPE#"))
INDEX_RS_ASC(@"SEL$804EC250" "COL"@"SEL$14" ("COL$"."OBJ#" "COL$"."INTCOL#"))
CLUSTER(@"SEL$804EC250" "AC"@"SEL$14")
INDEX(@"SEL$804EC250" "U"@"SEL$15" ("USER$"."USER#" "USER$"."TYPE#" "USER$"."SPARE1" "USER$"."SPARE2"))
LEADING(@"SEL$804EC250" "U"@"SEL$14" "O"@"SEL$7" "U"@"SEL$7" "C"@"SEL$2" "OC"@"SEL$2" "U"@"SEL$3" "C"@"SEL$14" "RC"@"SEL$2" "CD"@"SEL$14"
        "OI"@"SEL$2" "U"@"SEL$4" "UI"@"SEL$2" "RO"@"SEL$2" "CC"@"SEL$14" "O"@"SEL$15" "COL"@"SEL$14" "AC"@"SEL$14" "U"@"SEL$15")
USE_NL(@"SEL$804EC250" "O"@"SEL$7")
USE_HASH(@"SEL$804EC250" "U"@"SEL$7")
USE_NL(@"SEL$804EC250" "C"@"SEL$2")
USE_NL(@"SEL$804EC250" "OC"@"SEL$2")
USE_NL(@"SEL$804EC250" "U"@"SEL$3")
USE_NL(@"SEL$804EC250" "C"@"SEL$14")
USE_NL(@"SEL$804EC250" "RC"@"SEL$2")
USE_NL(@"SEL$804EC250" "CD"@"SEL$14")
USE_NL(@"SEL$804EC250" "OI"@"SEL$2")
USE_NL(@"SEL$804EC250" "U"@"SEL$4")
USE_NL(@"SEL$804EC250" "UI"@"SEL$2")
USE_NL(@"SEL$804EC250" "RO"@"SEL$2")
USE_NL(@"SEL$804EC250" "CC"@"SEL$14")
USE_NL(@"SEL$804EC250" "O"@"SEL$15")
USE_NL(@"SEL$804EC250" "COL"@"SEL$14")
USE_NL(@"SEL$804EC250" "AC"@"SEL$14")
USE_NL(@"SEL$804EC250" "U"@"SEL$15")
INDEX(@"SEL$9384AC1D" "O"@"SEL$5" ("OBJ$"."OBJ#" "OBJ$"."OWNER#" "OBJ$"."TYPE#"))
INDEX(@"SEL$9384AC1D" "U"@"SEL$5" ("USER$"."USER#" "USER$"."TYPE#" "USER$"."SPARE1" "USER$"."SPARE2"))
LEADING(@"SEL$9384AC1D" "O"@"SEL$5" "U"@"SEL$5")
USE_NL(@"SEL$9384AC1D" "U"@"SEL$5")
INDEX_SS(@"SEL$6" "U2"@"SEL$6" ("USER$"."USER#" "USER$"."TYPE#" "USER$"."SPARE1" "USER$"."SPARE2"))
INDEX(@"SEL$6" "O2"@"SEL$6" ("OBJ$"."DATAOBJ#" "OBJ$"."TYPE#" "OBJ$"."OWNER#"))
LEADING(@"SEL$6" "U2"@"SEL$6" "O2"@"SEL$6")
USE_NL(@"SEL$6" "O2"@"SEL$6")
INDEX_SS(@"SEL$8" "U2"@"SEL$8" ("USER$"."USER#" "USER$"."TYPE#" "USER$"."SPARE1" "USER$"."SPARE2"))
INDEX(@"SEL$8" "O2"@"SEL$8" ("OBJ$"."DATAOBJ#" "OBJ$"."TYPE#" "OBJ$"."OWNER#"))
LEADING(@"SEL$8" "U2"@"SEL$8" "O2"@"SEL$8")
USE_NL(@"SEL$8" "O2"@"SEL$8")
FULL(@"SEL$5ED1C707" "X$KZSPR"@"SEL$13")
INDEX(@"SEL$F6521A81" "OBJAUTH$"@"SEL$9" ("OBJAUTH$"."OBJ#" "OBJAUTH$"."GRANTOR#" "OBJAUTH$"."GRANTEE#" "OBJAUTH$"."PRIVILEGE#"
        "OBJAUTH$"."COL#"))
FULL(@"SEL$F6521A81" "X$KZSRO"@"SEL$10")
LEADING(@"SEL$F6521A81" "OBJAUTH$"@"SEL$9" "X$KZSRO"@"SEL$10")
USE_HASH(@"SEL$F6521A81" "X$KZSRO"@"SEL$10")
INDEX_SS(@"SEL$16" "U2"@"SEL$16" ("USER$"."USER#" "USER$"."TYPE#" "USER$"."SPARE1" "USER$"."SPARE2"))
INDEX(@"SEL$16" "O2"@"SEL$16" ("OBJ$"."DATAOBJ#" "OBJ$"."TYPE#" "OBJ$"."OWNER#"))
LEADING(@"SEL$16" "U2"@"SEL$16" "O2"@"SEL$16")
USE_NL(@"SEL$16" "O2"@"SEL$16")
FULL(@"SEL$A422EF13" "X$KZSPR"@"SEL$21")
INDEX(@"SEL$28294604" "OBJAUTH$"@"SEL$17" ("OBJAUTH$"."OBJ#" "OBJAUTH$"."GRANTOR#" "OBJAUTH$"."GRANTEE#" "OBJAUTH$"."PRIVILEGE#"
        "OBJAUTH$"."COL#"))
FULL(@"SEL$28294604" "X$KZSRO"@"SEL$18")
LEADING(@"SEL$28294604" "OBJAUTH$"@"SEL$17" "X$KZSRO"@"SEL$18")
USE_HASH(@"SEL$28294604" "X$KZSRO"@"SEL$18")
END_OUTLINE_DATA
*/

--//加入提示后执行,记下sql_id=a0amsx2fh77m6.

SYS@127.0.0.1:9014/ywdb> @ spsw a0amsx2fh77m6 0 c8s65f1cuhcb1 0 '' true
PL/SQL procedure successfully completed.
=================================================================================================================================================
if drop or alter sql profile ,run :
execute dbms_sqltune.drop_sql_profile(name => 'switch tuning c8s65f1cuhcb1')
execute dbms_sqltune.alter_sql_profile(name => 'switch tuning c8s65f1cuhcb1',attribute_name=>'STATUS',value=>'DISABLED')
=================================================================================================================================================

SYS@127.0.0.1:9014/ywdb> @ d_buffer c8s65f1cuhcb1 10 1
    EXECUTIONS1    BUFFER_GETS1   ELAPSED_TIME1 ROWS_PROCESSED1 每次buffer_gets    每次执行时间  平均处理记录数         INST_ID
--------------- --------------- --------------- --------------- --------------- --------------- --------------- ---------------
         218256       878579224     21866561264          195539 4025.4527893849 100187.67531706 .89591580529287               1

... sleep 10 , waiting ....

    EXECUTIONS2    BUFFER_GETS2   ELAPSED_TIME2 ROWS_PROCESSED2 每次buffer_gets    每次执行时间  平均处理记录数         INST_ID
--------------- --------------- --------------- --------------- --------------- --------------- --------------- ---------------
         218276       878580741     21866579006          195566 4025.0908986787 100178.57669189 .89595741171728               1

       执行次数   总buffer_gets      总执行时间    总处理记录数 每次buffer_gets    每次执行时间  平均处理记录数
--------------- --------------- --------------- --------------- --------------- --------------- ---------------
             20            1517           17742              27           75.85           887.1            1.35
--//逻辑读仅仅76次。

--//星期一上班观察结果如下:
SYS@127.0.0.1:9014/ywdb> @ ashtop sql_id sql_id='c8s65f1cuhcb1'   &day
    Total                                                                         Distinct Distinct
  Seconds     AAS %This   SQL_ID        FIRST_SEEN          LAST_SEEN           Execs Seen  Tstamps
--------- ------- ------- ------------- ------------------- ------------------- ---------- --------
      382      .0  100% | c8s65f1cuhcb1 2024-03-10 09:23:07 2024-03-11 09:15:46        353      344

--//大大的减少了执行时间。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3008682/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969669