ITPub博客

首页 > 数据库 > Oracle > [20240306]奇怪的高逻辑读.txt

[20240306]奇怪的高逻辑读.txt

原创 Oracle 作者:lfree 时间:2024-03-10 20:40:49 0 删除 编辑

[20240306]奇怪的高逻辑读.txt

--//生产系统遇到一条sql语句出现高逻辑读的情况,做一个记录并且分析。

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

SYS@127.0.0.1:9014/ywdb> @ sql_id 1f52yqf7s5bs3
--SQL_ID = 1f52yqf7s5bs3
Select sum ( zjje ) From zy_fymx Where yzxh =:1 And zyh =:2 ;

2.分析:

SYS@127.0.0.1:9014/ywdb> @ sqlhh 1f52yqf7s5bs3 100
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-05 16:00:23          1 1f52yqf7s5bs3      3005060615          5           73483            9441           1.0       1202877          41571           51731         1.2           15635               0               0
2024-03-05 16:00:23          2 1f52yqf7s5bs3      3005060615          2          111427            8610           0.5        250879          57754           98004         1.7            7547               0               0
2 rows selected.

--//注:参数2=100,表示查询100天的历史记录(实际上设置仅仅保留40天),视图dba_hist_sqlstat。
--//仅仅在awr记录几次逻辑读很高的情况,出现在昨天下午16-17点。

SYS@127.0.0.1:9014/ywdb> @ dpc 1f52yqf7s5bs3 '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  1f52yqf7s5bs3, child number 0
-------------------------------------
Select sum ( zjje ) From zy_fymx Where yzxh =:1 And zyh =:2
Plan hash value: 3005060615
------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name           | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                |        |       |     5 (100)|          |
|   1 |  SORT AGGREGATE              |                |      1 |    17 |            |          |
|*  2 |   TABLE ACCESS BY INDEX ROWID| ZY_FYMX        |      1 |    17 |     5   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN          | I_ZY_FYMX_YZXH |      4 |       |     3   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1
   2 - SEL$1 / ZY_FYMX@SEL$1
   3 - SEL$1 / ZY_FYMX@SEL$1
Peeked Binds (identified by position):
--------------------------------------
   1 - (NUMBER): 2010583299
   2 - (NUMBER): 20062047
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter("ZYH"=:2)
   3 - access("YZXH"=:1)
Note
-----
   - Warning: basic plan statistics not available. These are only collected when:
       * hint 'gather_plan_statistics' is used for the statement or
       * parameter 'statistics_level' is set to 'ALL', at session or system level
--//执行计划正常,没有出现隐式转换.

SYS@127.0.0.1:9014/ywdb> @ desczz pppppp_hhh.zy_fymx yzxh,zyh
eXtended describe of pppppp_hhh.zy_fymx

DISPLAY TABLE_NAME OF COLUMN_NAME INFORMATION.
INPUT   OWNER.TABLE_NAME  <filters>
SAMPLE  : @ desczz TABLE_NAME column_name1,column_name2
IF NOT INPUT <filters> ,USE "" .

Owner      Table_Name           SAMPLE_SIZE LAST_ANALYZED       Col# Column Name          Null?      Type                 NUM_DISTINCT        Density  NUM_NULLS HISTOGRAM       NUM_BUCKETS Low_value High_value
---------- -------------------- ----------- ------------------- ---- -------------------- ---------- -------------------- ------------ -------------- ---------- --------------- ----------- --------- -----------
pppppp_hhh ZY_FYMX                 27324487 2023-12-11 10:58:41    2 ZYH                  NOT NULL   NUMBER(18,0)                58240   .00001717033          0                           1 670168    40025105
                                   27014089 2023-12-11 10:58:41   23 YZXH                            NUMBER(18,0)              7678464   .00000013023     310398                           1 0         2009800527
2 rows selected.
       
--//注:YZXH表示医嘱序号,zyh表示住院号,选择使用YZXH字段索引理论讲效率较高(Density更小).

SYS@127.0.0.1:9014/ywdb> @ bind_cap 1f52yqf7s5bs3 ''
SQL_ID        CHILD_NUMBER WAS NAME                                       POSITION MAX_LENGTH LAST_CAPTURED       DATATYPE_STRING VALUE_STRING
------------- ------------ --- ---------------------------------------- ---------- ---------- ------------------- --------------- -------------
1f52yqf7s5bs3            0 YES :1                                                1         22 2024-03-06 09:18:52 NUMBER          2010665119
                           YES :2                                                2         22 2024-03-06 09:18:52 NUMBER          20062485

--//我尝试带入以上参数执行逻辑读并没有这么高,最多5,6个逻辑读。为什么昨天出现异常情况,理论讲这条语句不会出现awr报表中,
--//平时执行逻辑读以及次数都不是很高,查看历史绑定变量的值:

SYS@127.0.0.1:9014/ywdb> @ bind_cap_awr 1f52yqf7s5bs3 ''
@bind_cap_awr sql_id [column]
1 row selected.

   SNAP_ID INSTANCE_NUMBER SQL_ID        WAS LAST_CAPTURED       NAME   POSITION MAX_LENGTH DATATYPE_STRING VALUE_STRING
---------- --------------- ------------- --- ------------------- ---- ---------- ---------- --------------- ------------
     32574               2 1f52yqf7s5bs3 YES 2024-03-05 16:14:02 :1            1         22 NUMBER          0
                         2                                       :2            2         22 NUMBER          978498

                         1                   2024-03-05 16:46:08 :1            1         22 NUMBER          2010529840
                         1                                       :2            2         22 NUMBER          20061723

--//噢,参数1有带入0的情况。导致出现查询使用yzxh索引返回记录太多,再通过过滤zyh=:2效率很低。
SYS@127.0.0.1:9014/ywdb> @ cntgx pppppp_hhh.zy_fymx yzxh yzxh=0
select count(*) , yzxh  from pppppp_hhh.zy_fymx where yzxh=0 group by yzxh order by 1 desc;

  COUNT(*)       YZXH
---------- ----------
   3103564          0

SYS@127.0.0.1:9014/ywdb> @ cnt pppppp_hhh.zy_fymx
select count(*) from pppppp_hhh.zy_fymx;
COUNT(*)
----------
  29728335

--//3103564/29728335 = .1044 占10%的记录。没有办法很好的解决这个问题。

3.总结:
--//1.通过sql profile来使用zyh索引,但是大部分查询yzxh>0的,而且大于0的选择性很好。这样导致大部分的情况下执行效率偏低。
--//2.也可以通过sql profile来使用zyh索引以及yzxh索引,走位图与,这样情况与方法1类似,也许逻辑读小一些.对于yzxh=0的情况效率
--//比方法1要低.
--//3.建立复合索引YZXH+zyh,磁盘空间有点浪费,感觉有点多余。
--//4.当使用参数0时,不要使用绑定变量,这样要修改程序代码,并且在这个字段YZXH上要建立直方图。
--//总之,在我看来方法4最好,这样可以兼顾各种情况。向这种类似的修改提交开发基本选择不愿意改动代码。所以我为什么认为国内
--//的许多IT项目都是豆腐渣的原因.

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

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

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969292