数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

SQL质量差导致逻辑读比较多


发布日期:2020年05月17日
 
SQL质量差导致逻辑读比较多

最近日常检查查看awr报告发现由一个索引的逻辑读很大

Tablespace Subobject Obj Logical

Owner Name Object Name Name Type Reads %Total

BASECONF TBS_DEFALU PK_USER_TO_CHANNEL INDEX

VIPBILL TBS_DEFALU BIL_COLLECT_BIT TABLE

BASECONF DATA_ LAYER_CHANNEL_TO_NOD TABLE

BASECONF DATA_ PK_ INDEX

LOGBILL TBS_BAND_D IX_DAILYTABLE_ALL P INDEX

表结构如下

Create table

create table USER_TO_CHANNEL

(

USER_ID NUMBER() not null

CHANNEL_ID CHAR() not null

constraint PK_USER_TO_CHANNEL primary key (USER_ID CHANNEL_ID)

)

organization index;

这是一个索引组织表表的所有字段组成一个主键索引用索引组织表是没有问题的

查找top sql发现有如下sql操作USER_TO_CHANNEL

garqxtutkp

Module: JDBC Thin Client

select ACHANNEL_ID BCHANNEL_NAME from USER_TO_CHANNEL APUB_CHANNEL B where A

USER_ID= and ACHANNEL_ID=BCHANNEL_ID and BCHANNEL_TYPE=HTTP

SQL> select count(*) from USER_TO_CHANNEL;

COUNT(*)

SQL> select count(*) from PUB_CHANNEL;

COUNT(*)

SQL>

查看sql的执行计划

SQL> set autotrace traceonly;

SQL> select ACHANNEL_ID BCHANNEL_NAME

from USER_TO_CHANNEL A PUB_CHANNEL B

where AUSER_ID =

and ACHANNEL_ID = BCHANNEL_ID

and BCHANNEL_TYPE = HTTP;

rows selected

Execution Plan

| Id | Operation | Name | Rows | Bytes | Cost |

| | SELECT STATEMENT | | | | |

| | NESTED LOOPS | | | | |

| | TABLE ACCESS FULL| PUB_CHANNEL | | K| |

| | INDEX UNIQUE SCAN| PK_USER_TO_CHANNEL | | | |

Note

PLAN_TABLE is old version

Statistics

recursive calls

db block gets

consistent gets

physical reads

redo size

bytes sent via SQL*Net to client

bytes received via SQL*Net from client

SQL*Net roundtrips to/from client

sorts (memory)

sorts (disk)

rows processed

oracle默认采用NL进行全表扫描

此时的逻辑读=consistent gets+db block gets=

在sql语句中加入hint(

SQL> select /*+use_hash(ba)*/ ACHANNEL_ID BCHANNEL_NAME

from USER_TO_CHANNEL A PUB_CHANNEL B

where AUSER_ID =

and ACHANNEL_ID = BCHANNEL_ID

and BCHANNEL_TYPE = HTTP;

rows selected

Execution Plan

| Id | Operation | Name | Rows | Bytes | Cost |

| | SELECT STATEMENT | | | | |

| | HASH JOIN | | | | |

| | INDEX RANGE SCAN | PK_USER_TO_CHANNEL | | | |

| | TABLE ACCESS FULL| PUB_CHANNEL | | K| |

Note

PLAN_TABLE is old version

Statistics

recursive calls

db block gets

consistent gets

physical reads

redo size

bytes sent via SQL*Net to client

bytes received via SQL*Net from client

SQL*Net roundtrips to/from client

sorts (memory)

sorts (disk)

rows processed

在sql语句中加入hint此时的逻辑读有明显下降

此时的逻辑读=consistent gets+db block gets=

在sql语句中加入hint(

SQL> select /*+ use_nl(ba) leading(a) */ ACHANNEL_ID BCHANNEL_NAME

from USER_TO_CHANNEL A PUB_CHANNEL B

where AUSER_ID =

and ACHANNEL_ID = BCHANNEL_ID

and BCHANNEL_TYPE = HTTP;

rows selected

Execution Plan

| Id | Operation | Name | Rows | Bytes | Cost

|

| | SELECT STATEMENT | | | |

|

| | NESTED LOOPS | | | |

|

| | INDEX RANGE SCAN | PK_USER_TO_CHANNEL | | |

|

| | TABLE ACCESS BY INDEX ROWID| PUB_CHANNEL | | |

|

| | INDEX UNIQUE SCAN | PK_CHANNEL | | |

|

Note

PLAN_TABLE is old version

Statistics

recursive calls

db block gets

consistent gets

physical reads

redo size

bytes sent via SQL*Net to client

bytes received via SQL*Net from client

SQL*Net roundtrips to/from client

sorts (memory)

sorts (disk)

rows processed

SQL>

结论还是由于sql的质量比较差导致的逻辑读比较多

此时的逻辑读=consistent gets+db block gets=

感慨原因虽然找到了在一个线上系统查找该sql很困难总之在一个线上系统做点调整真难

上一篇:Oracle 数据表分区的策略

下一篇:在Linux机器上安装运行Oracle