0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Oracle长耗时SQL优化案例

冬至子 来源:琢磨先生DataBase 作者:琢磨先生DataBase 2023-05-19 15:02 次阅读

最近在生产客服平台,运营岗老师反馈,一个2w人的企业,在信息详情查询时,加载时间过长,越70s左右出结果,需要后台优化下SQL。

首先展示一下原SQL

select DISTINCT pma.member_apply_id,
                tm.mobile_num,
                tpp.product,
                tpp.plan_id,
                tpp.plan_name,
                pma.org_name,
                vtor.role_id,
                tp.person_id,
                tp.real_name,
                tp.certi_code,
                tp.birthday,
                pma.start_work_date,
                pma.rank,
                pma.retire_age,
                pma.month_base,
                ext.self_define_11,
                ext.now_month_salary,
                pma.employee_date,
                pma.eff_date,
                pma.employee_no,
                pma.member_sts_id,
                pma.account_state_id,
                tp.certi_type,
                tp.gender,
                decode(tp.gender, 'M', '男''F', '女') sexName,
                mt.member_sts_name memberStateName,
                amt.account_sate_desc accountStateName,
                ct.certi_type_name certiTypeName,
                pma.email
  FROM tms_plan_member_apply pma,
       tms_person tp,
       tms_mobile_number_screen tm,
       v_tms_org_role vtor,
       tms_product_plan tpp,
       tms_certi_type_tbl ct,
       tms_member_sts_tbl mt,
       tms_member_account_sate amt,
       tms_plan_member_collect_ext ext,
       (select max(pma2.member_apply_id) member_apply_id
          FROM tms_plan_member_apply pma2, tms_busi_apply tba2
         WHERE tba2.flow_sts_id = 9999
           AND EXISTS (SELECT 1
                  FROM v_tms_org_role T
                 WHERE t.role_type = '13'
                   AND t.ORG_NAME = pma2.org_name
                 START WITH T.ROLE_ID = '46000'
                CONNECT BY PRIOR T.ORG_ID = T.PARENT_ORG)
           AND tba2.apply_id = pma2.busi_apply_id
           AND tba2.plan_id = '39076'
         GROUP BY pma2.person_id) t1
 WHERE ((tm.screen_id =
       (select max(mm.screen_id)
            FROM tms_mobile_number_screen mm
           WHERE mm.person_id = tm.person_Id)) OR tm.screen_id is null)
   AND ext.apply_id(+) = pma.busi_apply_id
   AND ext.person_id(+) = pma.person_id
   AND ct.certi_type_id(+) = tp.certi_type
   AND pma.person_id = tp.person_id
   AND tm.person_id(+) = pma.person_id
   AND mt.member_sts_id(+) = pma.member_sts_id
   AND amt.account_sate_id(+) = pma.account_state_id
   AND vtor.org_name = pma.org_name
   AND vtor.ROLE_TYPE = 13
   AND t1.member_apply_id = pma.member_apply_id
   AND tpp.plan_id = '39076'
 ORDER BY tp.real_name

遇到这种SQL,我们第一步是要将无用的查询和码表去掉,来简化这种较长的SQL,如上面所展示,去除tms_mobile_number_screen 、tms_certi_type_tbl、tms_member_sts_tbl、tms_member_account_sate表关联。

之后发现,当去掉tms_plan_member_collect_ext这个表的关联条件后,查询的速度就特别快,SQL中,使用该表的关联条件为:

ext.apply_id(+) = pma.busi_apply_id

AND ext.person_id(+) = pma.person_id

oracle中的(+)是一种特殊的用法,(+)表示外连接,并且总是放在非主表的一方。例如左外连接:

select A.a,B.a from A LEFT JOIN B ON A.b=B.b;

等价于

select A.a,B.a from A,B where A.b = B.b (+);

再举个例子,这次是右外连接:

select A.a,B.a from A RIGHT JOIN B ON A.b=B.b;

等价于

select A.a,B.a from A,B where A.b (+) = B.b;

观察了一下ext表的结构,发现使用了联合索引,联合索引就是apply_id和person_id两个字段,这时候第一反应是索引是否生效,看了一下执行计划,确实走了索引,这里普及一下索引是否生效的例子:

索引:IDX(b,c)

select id where b = xx;

select id where c = xx;

上面的两句sql会走b,c的联合索引吗?

答案是第一条会走,第二条不会。

那多个字段的联合索引,使用部分字段会走索引吗?例如 IDX(a,b,c) select id where b = xx and c = xx;

答案是不会,其实不管是多少个字段的联合索引,不管查询顺序,不管查询用到了几个字段,只要没有使用联合索引的第一个字段,则不会走联合索引。

在数据量很大的表中,联合索引要比单个索引要慢,因为要比对两次,接着看表索引,发现该表有一个主键是索引,果断采用主键索引,因为唯一性高,使用主键索引后,速度立刻由70s下降到0.5s左右。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SQL
    SQL
    +关注

    关注

    1

    文章

    753

    浏览量

    44012
  • Oracle
    +关注

    关注

    2

    文章

    286

    浏览量

    35086
收藏 人收藏

    评论

    相关推荐

    连接oracle数据库,封装sql执行子vi

    连接oracle数据库,封装sql执行子vi。连接oracle数据库可以安装oracle客户端,或者通过odbc的方式去连接。连接后,可通过封装的子vi,执行
    发表于 07-03 12:07

    Oracle的经典sql总结

    Oracle常用经典sql
    发表于 10-15 06:46

    Oracle抽数到程序使用的SQL Server数据表

    利用Kettle将数据从Oracle抽数到SQL Server
    发表于 11-06 09:26

    C语言中使用嵌入式SQL访问Oracle数据库的方法

    使用C语言开发Oracle应用程序通常有两种方法。一是利用嵌入式SQL语言,将SQL作为子语言嵌入到C语言中,借助C语言访问Oracle以及实现过程化控制和复杂计算。二是利用
    发表于 12-15 06:35

    提高Oracle的数据库性能

    问题。通过优化SQL语句效率、扩充高级缓冲区和配置重做日志缓冲区等几个方面介绍了Oracle数据库优化方法,探讨了OraCle如何提高性能
    发表于 11-11 18:16 4次下载

    Oracle编程基础

    本章介绍Oracle编程基础,主要有PL/SQL相关内容和Oracle的控制语句。PL/SQL(Procedural Language/SQL
    发表于 03-26 16:15 14次下载

    ORACLE-体系结构-SQL语言简介

    ORACLE-体系结构-SQL语言简介(南京理士奥电源技术有限公司)-ORACLE-体系结构-SQL语言简介,有需要的可以参考!
    发表于 08-31 12:15 8次下载
    <b class='flag-5'>ORACLE</b>-体系结构-<b class='flag-5'>SQL</b>语言简介

    Oracle-sql语句收集整理大全

    Oracle-sql语句收集整理大全(开关电源技术综述课题)-文档为Oracle-sql语句收集整理大全总结文档,是一份不错的参考资料,感兴趣的可以下载看看,,,,,,,,,,,,,
    发表于 09-17 12:39 8次下载
    <b class='flag-5'>Oracle-sql</b>语句收集整理大全

    ORACLE数据库教程-SQL使用讲解

    ORACLE数据库教程-SQL使用讲解(普德新星电源技术有限公司最新招聘信息)-该文档为ORACLE数据库教程-SQL使用讲解文档,是一份还算不错的参考文档,感兴趣的可以下载看看,,,
    发表于 09-28 10:27 4次下载
    <b class='flag-5'>ORACLE</b>数据库教程-<b class='flag-5'>SQL</b>使用讲解

    Oracle.10g.Pl.SQL编程入门及开发

    Oracle.10g.Pl.SQL编程入门及开发教程免费下载。
    发表于 03-28 17:06 0次下载

    oracle用的是sql语句吗

    是的,Oracle使用的是SQL语言。SQL(Structured Query Language)是一种用于管理和操作关系型数据库的标准编程语言,被广泛应用于企业级数据库系统中,包括Oracl
    的头像 发表于 12-06 10:30 974次阅读

    oracle sql基本命令大全

    Oracle SQL(Structured Query Language)是一种用于管理和操作关系型数据库的标准化语言。它具有强大的查询和操作数据库的能力,通过简单的指令可实现复杂的操作。下面
    的头像 发表于 12-06 10:40 1170次阅读

    oracle sql 定义变量并赋值

    Oracle SQL中,变量是用来存储数据值的标识符。通过定义和使用变量,我们可以在SQL语句中使用它们来存储和处理数据,从而实现更灵活和动态的查询和操作。 在Oracle
    的头像 发表于 12-06 10:46 2515次阅读

    oracle执行sql查询语句的步骤是什么

    Oracle数据库是一种常用的关系型数据库管理系统,具有强大的SQL查询功能。Oracle执行SQL查询语句的步骤包括编写SQL语句、解析
    的头像 发表于 12-06 10:49 870次阅读

    Oracle如何执行sql脚本文件

    Oracle是一种关系型数据库管理系统,可用于存储、查询和管理大量的数据。在Oracle中,可以通过执行SQL脚本文件来一次性地执行多个SQL语句或者批量处理数据。在下面的文章中,我将
    的头像 发表于 12-06 10:51 6200次阅读