0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Oracle長(zhǎng)耗時(shí)SQL優(yōu)化案例

冬至子 ? 來(lái)源:琢磨先生DataBase ? 作者:琢磨先生DataBase ? 2023-05-19 15:02 ? 次閱讀

最近在生產(chǎn)客服平臺(tái),運(yùn)營(yíng)崗老師反饋,一個(gè)2w人的企業(yè),在信息詳情查詢時(shí),加載時(shí)間過(guò)長(zhǎng),越70s左右出結(jié)果,需要后臺(tái)優(yōu)化下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,我們第一步是要將無(wú)用的查詢和碼表去掉,來(lái)簡(jiǎn)化這種較長(zhǎng)的SQL,如上面所展示,去除tms_mobile_number_screen 、tms_certi_type_tbl、tms_member_sts_tbl、tms_member_account_sate表關(guān)聯(lián)。

之后發(fā)現(xiàn),當(dāng)去掉tms_plan_member_collect_ext這個(gè)表的關(guān)聯(lián)條件后,查詢的速度就特別快,SQL中,使用該表的關(guān)聯(lián)條件為:

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;

等價(jià)于

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

再舉個(gè)例子,這次是右外連接:

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

等價(jià)于

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

觀察了一下ext表的結(jié)構(gòu),發(fā)現(xiàn)使用了聯(lián)合索引,聯(lián)合索引就是apply_id和person_id兩個(gè)字段,這時(shí)候第一反應(yīng)是索引是否生效,看了一下執(zhí)行計(jì)劃,確實(shí)走了索引,這里普及一下索引是否生效的例子:

索引:IDX(b,c)

select id where b = xx;

select id where c = xx;

上面的兩句sql會(huì)走b,c的聯(lián)合索引嗎?

答案是第一條會(huì)走,第二條不會(huì)。

那多個(gè)字段的聯(lián)合索引,使用部分字段會(huì)走索引嗎?例如 IDX(a,b,c) select id where b = xx and c = xx;

答案是不會(huì),其實(shí)不管是多少個(gè)字段的聯(lián)合索引,不管查詢順序,不管查詢用到了幾個(gè)字段,只要沒(méi)有使用聯(lián)合索引的第一個(gè)字段,則不會(huì)走聯(lián)合索引。

在數(shù)據(jù)量很大的表中,聯(lián)合索引要比單個(gè)索引要慢,因?yàn)橐葘?duì)兩次,接著看表索引,發(fā)現(xiàn)該表有一個(gè)主鍵是索引,果斷采用主鍵索引,因?yàn)槲ㄒ恍愿撸褂弥麈I索引后,速度立刻由70s下降到0.5s左右。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    751

    瀏覽量

    43986
  • Oracle
    +關(guān)注

    關(guān)注

    2

    文章

    285

    瀏覽量

    35076
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    連接oracle數(shù)據(jù)庫(kù),封裝sql執(zhí)行子vi

    連接oracle數(shù)據(jù)庫(kù),封裝sql執(zhí)行子vi。連接oracle數(shù)據(jù)庫(kù)可以安裝oracle客戶端,或者通過(guò)odbc的方式去連接。連接后,可通過(guò)封裝的子vi,執(zhí)行
    發(fā)表于 07-03 12:07

    Oracle的經(jīng)典sql總結(jié)

    Oracle常用經(jīng)典sql
    發(fā)表于 10-15 06:46

    Oracle抽數(shù)到程序使用的SQL Server數(shù)據(jù)表

    利用Kettle將數(shù)據(jù)從Oracle抽數(shù)到SQL Server
    發(fā)表于 11-06 09:26

    C語(yǔ)言中使用嵌入式SQL訪問(wèn)Oracle數(shù)據(jù)庫(kù)的方法

    使用C語(yǔ)言開發(fā)Oracle應(yīng)用程序通常有兩種方法。一是利用嵌入式SQL語(yǔ)言,將SQL作為子語(yǔ)言嵌入到C語(yǔ)言中,借助C語(yǔ)言訪問(wèn)Oracle以及實(shí)現(xiàn)過(guò)程化控制和復(fù)雜計(jì)算。二是利用
    發(fā)表于 12-15 06:35

    提高Oracle的數(shù)據(jù)庫(kù)性能

    問(wèn)題。通過(guò)優(yōu)化SQL語(yǔ)句效率、擴(kuò)充高級(jí)緩沖區(qū)和配置重做日志緩沖區(qū)等幾個(gè)方面介紹了Oracle數(shù)據(jù)庫(kù)優(yōu)化方法,探討了OraCle如何提高性能
    發(fā)表于 11-11 18:16 ?4次下載

    Oracle編程基礎(chǔ)

    本章介紹Oracle編程基礎(chǔ),主要有PL/SQL相關(guān)內(nèi)容和Oracle的控制語(yǔ)句。PL/SQL(Procedural Language/SQL
    發(fā)表于 03-26 16:15 ?14次下載

    ORACLE-體系結(jié)構(gòu)-SQL語(yǔ)言簡(jiǎn)介

    ORACLE-體系結(jié)構(gòu)-SQL語(yǔ)言簡(jiǎn)介(南京理士奧電源技術(shù)有限公司)-ORACLE-體系結(jié)構(gòu)-SQL語(yǔ)言簡(jiǎn)介,有需要的可以參考!
    發(fā)表于 08-31 12:15 ?8次下載
    <b class='flag-5'>ORACLE</b>-體系結(jié)構(gòu)-<b class='flag-5'>SQL</b>語(yǔ)言簡(jiǎn)介

    Oracle-sql語(yǔ)句收集整理大全

    Oracle-sql語(yǔ)句收集整理大全(開關(guān)電源技術(shù)綜述課題)-文檔為Oracle-sql語(yǔ)句收集整理大全總結(jié)文檔,是一份不錯(cuò)的參考資料,感興趣的可以下載看看,,,,,,,,,,,,,
    發(fā)表于 09-17 12:39 ?8次下載
    <b class='flag-5'>Oracle-sql</b>語(yǔ)句收集整理大全

    ORACLE數(shù)據(jù)庫(kù)教程-SQL使用講解

    ORACLE數(shù)據(jù)庫(kù)教程-SQL使用講解(普德新星電源技術(shù)有限公司最新招聘信息)-該文檔為ORACLE數(shù)據(jù)庫(kù)教程-SQL使用講解文檔,是一份還算不錯(cuò)的參考文檔,感興趣的可以下載看看,,,
    發(fā)表于 09-28 10:27 ?4次下載
    <b class='flag-5'>ORACLE</b>數(shù)據(jù)庫(kù)教程-<b class='flag-5'>SQL</b>使用講解

    Oracle.10g.Pl.SQL編程入門及開發(fā)

    Oracle.10g.Pl.SQL編程入門及開發(fā)教程免費(fèi)下載。
    發(fā)表于 03-28 17:06 ?0次下載

    oracle用的是sql語(yǔ)句嗎

    是的,Oracle使用的是SQL語(yǔ)言。SQL(Structured Query Language)是一種用于管理和操作關(guān)系型數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)編程語(yǔ)言,被廣泛應(yīng)用于企業(yè)級(jí)數(shù)據(jù)庫(kù)系統(tǒng)中,包括Oracl
    的頭像 發(fā)表于 12-06 10:30 ?945次閱讀

    oracle sql基本命令大全

    Oracle SQL(Structured Query Language)是一種用于管理和操作關(guān)系型數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)化語(yǔ)言。它具有強(qiáng)大的查詢和操作數(shù)據(jù)庫(kù)的能力,通過(guò)簡(jiǎn)單的指令可實(shí)現(xiàn)復(fù)雜的操作。下面
    的頭像 發(fā)表于 12-06 10:40 ?1152次閱讀

    oracle sql 定義變量并賦值

    Oracle SQL中,變量是用來(lái)存儲(chǔ)數(shù)據(jù)值的標(biāo)識(shí)符。通過(guò)定義和使用變量,我們可以在SQL語(yǔ)句中使用它們來(lái)存儲(chǔ)和處理數(shù)據(jù),從而實(shí)現(xiàn)更靈活和動(dòng)態(tài)的查詢和操作。 在Oracle
    的頭像 發(fā)表于 12-06 10:46 ?2358次閱讀

    oracle執(zhí)行sql查詢語(yǔ)句的步驟是什么

    Oracle數(shù)據(jù)庫(kù)是一種常用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),具有強(qiáng)大的SQL查詢功能。Oracle執(zhí)行SQL查詢語(yǔ)句的步驟包括編寫SQL語(yǔ)句、解析
    的頭像 發(fā)表于 12-06 10:49 ?849次閱讀

    Oracle如何執(zhí)行sql腳本文件

    Oracle是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),可用于存儲(chǔ)、查詢和管理大量的數(shù)據(jù)。在Oracle中,可以通過(guò)執(zhí)行SQL腳本文件來(lái)一次性地執(zhí)行多個(gè)SQL語(yǔ)句或者批量處理數(shù)據(jù)。在下面的文章中,我將
    的頭像 發(fā)表于 12-06 10:51 ?5953次閱讀