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

优化案例

原创 colin 2024-04-28
77

今天记录点啥呢,记个今天的工作优化案例吧


运维反馈语句执行慢,卡的出不来结果,具体sql如下:

select a.billingdate ,a.prodid ,a.branchid, b.abc ,a.invbalqty , b.outboundqty,b.outboundqty*3 qhx,a.ioid,a.ioname
from tgsc a,(
select a.prodid,a.outboundqty,nvl(b.sellabc ,'C') abc,a.branchid,a.ioid
from tgss a
left join tgsabc b  on a.branchid=b.branchid and a.prodid=b.prodid and a.ioid=b.ioid
where  exists (select 1 from tgys where prodid=a.prodid and branchid=a.branchid and ioid=a.ioid)
and a.branchid='FFD1L') b
where a.branchid=b.branchid and a.prodid=b.prodid and a.branchid='FFD1L' and a.ioid=b.ioid
    and b.abc like 'A%'
    and a.invbalqty<b.outboundqty*3;


执行计划

 Plan Hash Value  : 1926411222 

---------------------------------------------------------------------------------------------------
| Id   | Operation                        | Name                 | Rows | Bytes | Cost | Time     |
---------------------------------------------------------------------------------------------------
|    0 | SELECT STATEMENT                 |                      |    1 |   295 | 4676 | 00:00:57 |
|  * 1 |   FILTER                         |                      |      |       |      |          |
|    2 |    NESTED LOOPS OUTER            |                      |    1 |   295 | 4676 | 00:00:57 |
|    3 |     NESTED LOOPS                 |                      |    1 |   269 | 4676 | 00:00:57 |
|    4 |      MERGE JOIN CARTESIAN        |                      |    1 |   213 | 4676 | 00:00:57 |
|  * 5 |       TABLE ACCESS FULL          | TGSC                 |    1 |   167 | 4676 | 00:00:57 |
|    6 |       BUFFER SORT                |                      |    1 |    46 |    0 | 00:00:01 |
|    7 |        SORT UNIQUE               |                      |    1 |    46 |    0 | 00:00:01 |
|  * 8 |         INDEX RANGE SCAN         | IX_TGYS_BPI          |    1 |    46 |    0 | 00:00:01 |
|  * 9 |      TABLE ACCESS BY INDEX ROWID | TGSS                 |    1 |    56 |    0 | 00:00:01 |
| * 10 |       INDEX RANGE SCAN           | IX_TGSS_BPI          |    1 |       |    0 | 00:00:01 |
|   11 |     TABLE ACCESS BY INDEX ROWID  | TGSABC               |    1 |    26 |    0 | 00:00:01 |
| * 12 |      INDEX UNIQUE SCAN           | INDEX_UNIQUE         |    1 |       |    0 | 00:00:01 |
---------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
------------------------------------------
* 1 - filter(NVL("B"."SELLABC",'C') LIKE 'A%')
* 5 - filter("A"."BRANCHID"='FFD1L')
* 8 - access("BRANCHID"='FFD1L')
* 9 - filter("A"."INVBALQTY"<"A"."OUTBOUNDQTY"*3)
* 10 - access("BRANCHID"="A"."BRANCHID" AND "PRODID"="A"."PRODID" AND "IOID"="A"."IOID")
* 10 - filter("A"."BRANCHID"='FFD1L' AND "A"."BRANCHID"="A"."BRANCHID" AND "A"."PRODID"="A"."PRODID" AND "A"."IOID"="A"."IOID")
* 12 - access("B"."BRANCHID"(+)='FFD1L' AND "A"."PRODID"="B"."PRODID"(+) AND "A"."IOID"="B"."IOID"(+))


可以看出主要是TGSC表扫描全表导致,数据量大概两百多万,branchid和ioid去重后是个位数


根据执行计划和上述表的情况,尝试给出解决方案

create index index_lscs1 on (prodid,branchid,ioid) nologging;


优化后

 Plan Hash Value  : 4150093441 

-----------------------------------------------------------------------------------------------------
| Id   | Operation                          | Name                 | Rows | Bytes | Cost | Time     |
-----------------------------------------------------------------------------------------------------
|    0 | SELECT STATEMENT                   |                      |    1 |   295 |   31 | 00:00:01 |
|    1 |   NESTED LOOPS                     |                      |    1 |   295 |   31 | 00:00:01 |
|    2 |    NESTED LOOPS                    |                      |    1 |   295 |   31 | 00:00:01 |
|  * 3 |     FILTER                         |                      |      |       |      |          |
|    4 |      NESTED LOOPS OUTER            |                      |    1 |   128 |    2 | 00:00:01 |
|    5 |       NESTED LOOPS                 |                      |    1 |   102 |    2 | 00:00:01 |
|    6 |        SORT UNIQUE                 |                      |    1 |    46 |    1 | 00:00:01 |
|  * 7 |         INDEX RANGE SCAN           | IX_TGYS_BPI          |    1 |    46 |    1 | 00:00:01 |
|    8 |        TABLE ACCESS BY INDEX ROWID | TGSS                 |    1 |    56 |    0 | 00:00:01 |
|  * 9 |         INDEX RANGE SCAN           | IX_TGSS_BPI          |    1 |       |    0 | 00:00:01 |
|   10 |       TABLE ACCESS BY INDEX ROWID  | TGSABC               |    1 |    26 |    0 | 00:00:01 |
| * 11 |        INDEX UNIQUE SCAN           | INDEX_UNIQUE         |    1 |       |    0 | 00:00:01 |
| * 12 |     INDEX RANGE SCAN               | INDEX_LSCS1          |    1 |       |    2 | 00:00:01 |
| * 13 |    TABLE ACCESS BY INDEX ROWID     | TGSC                 |    1 |   167 |   29 | 00:00:01 |
-----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
------------------------------------------
* 3 - filter(NVL("B"."SELLABC",'C') LIKE 'A%')
* 7 - access("BRANCHID"='FFD1L')
* 9 - access("BRANCHID"="A"."BRANCHID" AND "PRODID"="A"."PRODID" AND "IOID"="A"."IOID")
* 9 - filter("A"."BRANCHID"='FFD1L')
* 11 - access("B"."BRANCHID"(+)='FFD1L' AND "A"."PRODID"="B"."PRODID"(+) AND "A"."IOID"="B"."IOID"(+))
* 12 - access("A"."PRODID"="A"."PRODID" AND "A"."BRANCHID"='FFD1L' AND "A"."IOID"="A"."IOID")
* 12 - filter("A"."BRANCHID"="A"."BRANCHID")
* 13 - filter("A"."INVBALQTY"<"A"."OUTBOUNDQTY"*3)


结果:0.18秒执行完成



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

评论