在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    764

    瀏覽量

    44128
  • Oracle
    +關注

    關注

    2

    文章

    289

    瀏覽量

    35131
收藏 人收藏

    評論

    相關推薦

    連接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 ?1077次閱讀

    oracle sql基本命令大全

    Oracle SQL(Structured Query Language)是一種用于管理和操作關系型數據庫的標準化語言。它具有強大的查詢和操作數據庫的能力,通過簡單的指令可實現復雜的操作。下面
    的頭像 發表于 12-06 10:40 ?1253次閱讀

    oracle sql 定義變量并賦值

    Oracle SQL中,變量是用來存儲數據值的標識符。通過定義和使用變量,我們可以在SQL語句中使用它們來存儲和處理數據,從而實現更靈活和動態的查詢和操作。 在Oracle
    的頭像 發表于 12-06 10:46 ?2818次閱讀

    oracle執行sql查詢語句的步驟是什么

    Oracle數據庫是一種常用的關系型數據庫管理系統,具有強大的SQL查詢功能。Oracle執行SQL查詢語句的步驟包括編寫SQL語句、解析
    的頭像 發表于 12-06 10:49 ?973次閱讀

    Oracle如何執行sql腳本文件

    Oracle是一種關系型數據庫管理系統,可用于存儲、查詢和管理大量的數據。在Oracle中,可以通過執行SQL腳本文件來一次性地執行多個SQL語句或者批量處理數據。在下面的文章中,我將
    的頭像 發表于 12-06 10:51 ?6718次閱讀
    主站蜘蛛池模板: 欧美系列在线| 一区二区三区精品国产欧美| 亚洲欧美视频在线| 一区二区三区中文| 亚洲国产精品va在线观看麻豆| 欧美两性网| 狠狠色丁香久久婷婷综合丁香 | 国产三级播放| a级毛片网| 性xxxx欧美| 他也色在线| 又粗又硬又爽又黄毛片| avtt天堂网 手机资源| 四虎国产视频| 午夜高清免费观看视频| 亚洲春色www| 萌白酱一线天粉嫩喷水在线观看| 色综色| 国产精品三级a三级三级午夜| 免费在线观看a| 中文字幕天天干| v视界影院最新网站| 午夜性爽爽爽| 97就要鲁就要鲁夜夜爽| 中文字幕一区二区三区免费看| 日本三级视频| www.av123| 视频在线观看免费网站| 色妞影视| 翘臀白浆| 亚洲图色视频| bt种子在线www天堂官网| 亚洲综合一区二区三区| 免费观看欧美一级片| 国产三片高清在线观看| 天堂bt| 天天射网站| 亚洲狠狠婷婷综合久久久久图片| freee性欧美| 高h细节肉爽文bl1v1| 99一级毛片|