精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

層次查詢SQL性能故障不斷?給你份可靠的避坑指南!

數(shù)據(jù)庫 SQL Server
近期頻頻遇到層次查詢SQL的性能問題,結(jié)合歷史故障案例,匯總了一些場景connect by常見的性能故障類型,在本文中做個分享。

近期頻頻遇到層次查詢SQL的性能問題,結(jié)合歷史故障案例,匯總了一些場景connect by常見的性能故障類型,在本文中做個分享。

一、結(jié)果中過濾or生成樹中過濾

過濾條件放置于where后,為在結(jié)果樹生成完成后裁剪葉子節(jié)點(diǎn);放置于connect by后,為在生成樹的過程中裁剪子樹。

頻繁發(fā)生的現(xiàn)象是業(yè)務(wù)邏輯上其實(shí)并不需要先生成結(jié)果樹再去過濾,由于開發(fā)人員對過濾條件放置于不同的位置(where 后,connect by后)產(chǎn)生的過濾效果混淆,導(dǎo)致了低效的性能。

下面這個SQL就是典型案例。用戶反饋,zzzz.SYS_RC_ROUTE_DETAIL表上生產(chǎn)環(huán)境就3000+條數(shù)據(jù),但SQL語句運(yùn)行時卻跑不出來結(jié)果:

 

  1. select  xxxxx 
  2.   from zzzz.SYS_RC_ROUTE_DETAIL t 
  3.  where t.route_id = (select a.route_id 
  4.                        from xxx.sys_rc_route a, xxx.g_wo_base b 
  5.                       where a.route_id = b.route_id 
  6.                         and b.work_order = 'yyyyyyyyy'
  7.  start with t.node_type = '0' 
  8. connect by nocycle prior next_node_id = node_id 

讓客戶運(yùn)行了SQL一分鐘后cancel掉,抓取了監(jiān)視報(bào)告如下:

層次查詢SQL性能故障不斷?給你份可靠的避坑指南!

問題點(diǎn)很明顯,表中nextnodeid = node_id的重復(fù)值很多,導(dǎo)致了海量的結(jié)果集。SQL運(yùn)行的一分鐘內(nèi),connect by尚未把完整的樹生產(chǎn)完成,就已經(jīng)有了3000W+數(shù)據(jù),于是我們開始思考,在邏輯上是否有必要在構(gòu)建完整的樹后再過濾。

與業(yè)務(wù)部門溝通后,發(fā)現(xiàn)果然不需要。

以下數(shù)據(jù)可以測試下,3000行數(shù)據(jù)量,但是count(*) 會非常慢。

 

  1. SQL> create table test1 as 
  2. select 
  3.     mod(rownum,2)                     id, 
  4.     mod(rownum +1 ,2)                  id2 
  5. from 
  6.     dual 
  7. connect by level <= 3000 
  8. ;  2    3    4    5    6    7    8 
  9.  
  10. Table created. 
  11.  
  12. SQL> set timing on 
  13. SQL> select count(*) from test1  where id =0  start with id =0 connect by nocycle prior id = id2 ; 
  14.  
  15.   COUNT(*) 
  16. ---------- 
  17.       1500 
  18.  
  19. Elapsed: 00:09:26.88 
  20. SQL> 

結(jié)果中過濾如上所示,用了9分鐘;而生成樹中過濾則只用0.3s:

 

  1. SQL> select count(*) from test1  start with id =0 connect by nocycle prior id = id2 and id = 0 ; 
  2.  
  3.   COUNT(*) 
  4. ---------- 
  5.       1500 
  6.  
  7. Elapsed: 00:00:00.31 

很多情況下,兩種寫法的結(jié)果集可能是相同的,如下:

 

  1. create table test2 as 
  2.  select 
  3.       rownum                     id, 
  4.       rownum +1                 id2, 
  5.       rownum + 2               id3 
  6.  from 
  7.      dual 
  8.  connect by level <= 3000; 
  9.  
  10.  SQL> select id from test2 where id3 < 10 start with id = 3 connect by nocycle prior id2 = id; 
  11.  
  12.      ID 
  13.  ---------- 
  14.       1 
  15.       2 
  16.       3 
  17.       4 
  18.       5 
  19.       6 
  20.       7 
  21.  
  22.  7 rows selected. 
  23.  
  24.  SQL> select id from test2  start with id = 1 connect by nocycle prior id2 = id and id3 <10; 
  25.  
  26.      ID 
  27.  ---------- 
  28.       1 
  29.       2 
  30.       3 
  31.       4 
  32.       5 
  33.       6 
  34.       7 
  35.  
  36.  7 rows selected. 

但其實(shí)這兩種寫法在語義上差別很大,結(jié)果集也可能不相同,如下:

 

  1.   SQL> select id from test2 where id3 = 10 start with id = 3 connect by nocycle prior id2 = id; 
  2.  
  3.     ID 
  4. ---------- 
  5.      8 
  6.  
  7. Elapsed: 00:00:00.13 
  8.  
  9. SQL> select id from test2  start with id = 3 connect by nocycle prior id2 = id and id3=10; 
  10.  
  11.     ID 
  12. ---------- 
  13.      3 
  14.  
  15. Elapsed: 00:00:00.00 

二、CBO估算不準(zhǔn)確

層次查詢的SQL語句頻繁出現(xiàn)的問題,就是CBO估算返回結(jié)果集偏差,引起執(zhí)行計(jì)劃不準(zhǔn)確。雖然表上收集過統(tǒng)計(jì)信息,但是CBO對于結(jié)果集的估算跟實(shí)際值偏差非常大(幾百上千的倍的差距),但是這個也不能全怪CBO,畢竟遞歸查詢有多少層、有多少數(shù)據(jù)要裁剪,結(jié)合起來考慮,結(jié)果確實(shí)難以估量。

層次查詢SQL性能故障不斷?給你份可靠的避坑指南!

 

層次查詢SQL性能故障不斷?給你份可靠的避坑指南!

對于CBO估算不準(zhǔn)的問題,我們考慮了對結(jié)果集相對特殊的參數(shù),在SQL文本上做區(qū)分,應(yīng)用識別特殊參數(shù)運(yùn)行帶hint地改造SQL,通過hint來指定返回結(jié)果集。這種情況不同于普通的數(shù)據(jù)傾斜,無法通過baseline給出一個不涉及應(yīng)用改造的方案。

層次查詢SQL性能故障不斷?給你份可靠的避坑指南!

三、并行處理

層次查詢的SQL直接使用parallel的hint,會遭遇并行串行化的問題,也就是不能真正并行。對于一些重要且耗時長的層次查詢,可以考慮PIPELINED TABLE FUNCTION改寫SQL的方式來實(shí)現(xiàn)。

以下腳本測試參考了陳煥生童鞋的blog以及oracle相關(guān)文檔(Doc ID 2168864.1):

 

  1. drop table t1; 
  2. -- t1 with 100,000 rows 
  3. create table t1 
  4. as 
  5. select 
  6.     rownum                      id, 
  7.     lpad(rownum, 10, '0')       v1, 
  8.     trunc((rownum - 1)/100)     n1, 
  9.     rpad(rownum, 100)           padding 
  10. from 
  11.     dual 
  12. connect by level <= 100000 
  13.  
  14. begin 
  15.     dbms_stats.gather_table_stats(user,'T1'); 
  16. end
  17.  
  18. select /*+ monitor */ 
  19.     count(*) 
  20. from 
  21.     select 
  22.         CONNECT_BY_ROOT ltrim(id) root_id, 
  23.         CONNECT_BY_ISLEAF is_leaf, 
  24.         level as t1_level, 
  25.         a.v1 
  26.     from t1 a 
  27.     start with a.id <=1000 
  28.     connect by NOCYCLE id = prior id + 1000 
  29. ); 
  30.  
  31. create or replace package refcur_pkg 
  32. AS 
  33.     TYPE R_REC IS RECORD (row_id ROWID); 
  34.     TYPE refcur_t IS REF CURSOR RETURN R_REC; 
  35. END
  36.  
  37. create or replace package connect_by_parallel 
  38. as 
  39.    /*  Naviagates a shallow hiearchy in parallel, where we do a tree walk for each root */ 
  40.  
  41.     CURSOR C1 (p_rowid ROWID) IS     -- Cursor done for each subtree. This select is provided by the customer 
  42.     select  CONNECT_BY_ROOT ltrim(id) root_id, CONNECT_BY_ISLEAF is_leaf, level as t1_level, a.v1 
  43.           from t1 a 
  44.           start with rowid = p_rowid 
  45.           connect by NOCYCLE id = prior id + 1000; 
  46.  
  47.     TYPE T1_TAB is TABLE OF C1%ROWTYPE; 
  48.  
  49.     FUNCTION treeWalk (p_ref refcur_pkg.refcur_t) RETURN T1_TAB 
  50.              PIPELINED 
  51.     PARALLEL_ENABLE(PARTITION p_ref BY ANY); 
  52.  
  53. END connect_by_parallel; 
  54.  
  55. create or replace package body connect_by_parallel 
  56. as  
  57. FUNCTION treeWalk (p_ref refcur_pkg.refcur_t) RETURN T1_TAB 
  58.           PIPELINED PARALLEL_ENABLE(PARTITION p_ref BY ANY
  59. IS 
  60.   in_rec p_ref%ROWTYPE; 
  61. BEGIN 
  62.    execute immediate 'alter session set "_old_connect_by_enabled"=true'
  63.    LOOP -- for each root 
  64.     FETCH p_ref INTO in_rec; 
  65.     EXIT WHEN p_ref%NOTFOUND; 
  66.     FOR c1rec IN c1(in_rec.row_id)  LOOP -- retrieve rows of subtree 
  67.         PIPE ROW(c1rec); 
  68.     END LOOP; 
  69.   END LOOP; 
  70.   execute immediate 'alter session set "_old_connect_by_enabled"=false';  
  71.   RETURN
  72. END  treeWalk; 
  73.  
  74. END connect_by_parallel; 
  75.  
  76. SELECT 
  77.   /*+ monitor */ 
  78.   COUNT(*) 
  79. FROM TABLE(connect_by_parallel.treeWalk (CURSOR 
  80.   (SELECT /*+ parallel (a 100) */ 
  81.     rowid FROM t1 a WHERE id <= 100))) b; 

層次查詢的SQL在整個SQL優(yōu)化場景中占比相對較小,但這種類型的SQL優(yōu)化卻往往比較麻煩,本文分享的三個案例均為實(shí)戰(zhàn)中總結(jié),對于Oracle層次查詢的SQL優(yōu)化有極大的借鑒意義,特別是陳煥生提供的做并行的案例,含金量很高,感興趣的童鞋可以測試下。

作者介紹

蔣健,云趣網(wǎng)絡(luò)科技聯(lián)合創(chuàng)始人,Oracle ACE,11g OCM,多年Oracle設(shè)計(jì)、管理及實(shí)施經(jīng)驗(yàn),精通數(shù)據(jù)庫優(yōu)化,Oracle CBO及并行原理。云趣鷹眼監(jiān)控核心設(shè)計(jì)和開發(fā)者,資深Python Web開發(fā)者。

責(zé)任編輯:未麗燕 來源: DBAplus社群
相關(guān)推薦

2018-07-03 10:49:22

性能故障排查

2024-04-03 12:30:00

C++開發(fā)

2024-04-24 13:45:00

2021-02-26 00:46:11

CIO數(shù)據(jù)決策數(shù)字化轉(zhuǎn)型

2020-12-16 10:00:59

Serverless數(shù)字化云原生

2023-05-24 10:06:42

多云實(shí)踐避坑

2022-03-04 18:11:16

信服云

2021-05-07 21:53:44

Python 程序pyinstaller

2021-02-22 17:00:31

Service Mes微服務(wù)開發(fā)

2021-05-08 12:30:03

Pythonexe代碼

2018-01-20 20:46:33

2020-06-12 11:03:22

Python開發(fā)工具

2021-04-28 09:26:25

公有云DTS工具

2020-08-26 07:37:25

Nacos微服務(wù)SpringBoot

2023-11-01 15:32:58

2019-02-12 15:07:42

屏幕參數(shù)PC

2018-03-26 11:14:13

程序猿bug代碼

2019-04-24 17:45:24

微服務(wù)容器青云

2020-09-13 09:19:10

LinuxPython3.6

2024-03-28 12:51:00

Spring異步多線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

精品久久久久久久久久中文字幕| 欧美孕妇性xx| 日本中文字幕二区| 天堂8中文在线| 久久在线观看免费| 国产日韩欧美在线视频观看| 国产精品久久久精品四季影院| 国产成人福利av| 91久久奴性调教| 大地资源网在线观看免费官网| 三级视频网站在线| 精品一区二区综合| 欧美亚洲午夜视频在线观看| 黄色录像一级片| 亚洲动漫精品| 日韩亚洲国产中文字幕欧美| 精品久久久久久久无码 | 91在线视频在线| 成人黄色免费网站在线观看| 毛片在线免费视频| 欧美/亚洲一区| 综合网中文字幕| 麻豆tv在线观看| 色综合一区二区日本韩国亚洲| 欧美日韩激情小视频| 国产美女视频免费| www在线免费观看| av在线这里只有精品| 国产美女久久精品| 少妇久久久久久久| 亚洲麻豆一区| 欧美极品少妇xxxxⅹ裸体艺术| 日日操免费视频| 久久99国内| 日韩激情视频在线| 亚洲一区二区在线免费| 99ri日韩精品视频| 欧美一区二区播放| 手机免费看av网站| 国产精品99久久久久久董美香| 欧美三级xxx| 欧美三级在线观看视频| 日日夜夜天天综合入口| 最新成人av在线| 亚洲欧洲日韩综合二区| 色视频在线观看免费| 成人亚洲精品久久久久软件| 亚洲一区二区三区毛片| 国产精品久久久久久久久久久久久久久久 | www.九色.com| 日韩123区| 一区二区三区精品视频在线| mm131午夜| 2024最新电影免费在线观看| 一区二区三区色| 成人国产在线看| 麻豆av在线播放| 亚洲国产一区二区三区青草影视| 欧美中日韩在线| 国产羞羞视频在线播放| 亚洲午夜影视影院在线观看| 欧美图片激情小说| sm久久捆绑调教精品一区| 亚洲成va人在线观看| 成人黄色大片网站| 狠狠操一区二区三区| 福利精品视频在线| 蜜臀视频一区二区三区| 天堂久久午夜av| 欧美日韩在线观看一区二区| 亚洲欧美手机在线| 这里视频有精品| 日韩国产在线播放| 亚洲精品成人av久久| 香蕉视频官网在线观看日本一区二区| 久久精品一本久久99精品| 欧美日韩一级大片| 一本久久综合| 国产精品天天狠天天看| 国产情侣av在线| 成人动漫中文字幕| 日本高清一区| caoporm免费视频在线| 亚洲综合色网站| 国产91对白刺激露脸在线观看| 日韩成人高清| 日韩三区在线观看| 添女人荫蒂视频| 久久国产影院| 欧美精品videos性欧美| 欧美一区二区三区不卡视频| 黄网站免费久久| 精品国产_亚洲人成在线| 国产黄色免费在线观看| 亚洲免费av网站| 北条麻妃69av| 精品国产麻豆| 亚洲社区在线观看| 久久久久亚洲av无码专区| 久久三级视频| eeuss一区二区三区| 国产二区在线播放| 偷窥国产亚洲免费视频| 不用播放器的免费av| 网友自拍一区| 欧美日韩成人免费| 中文字幕在线播放不卡| jizz一区二区| 超碰人人爱人人| 国产美女久久| 国产视频丨精品|在线观看| 最新av电影网站| 日韩在线播放一区二区| 国产精品免费视频一区二区| 伦xxxx在线| 在线观看欧美黄色| 国模私拍在线观看| 午夜国产精品视频| 国产日韩在线亚洲字幕中文| 欧美捆绑视频| 亚洲风情在线资源站| 久久久久久综合网| 精品久久精品| 热久久视久久精品18亚洲精品| www.av在线.com| 亚洲人成人一区二区在线观看 | 免费网站看av| 九九视频精品免费| 日韩国产精品一区二区| 天堂av中文在线观看| 亚洲精品在线观看视频| 欧美三级免费看| 韩国三级在线一区| 自拍偷拍亚洲色图欧美| 成人在线免费电影网站| 亚洲女人天堂av| 国产性猛交普通话对白| 国产一区二区三区高清播放| 亚洲乱码一区二区三区三上悠亚| 欧美电影免费观看| 亚洲美女久久久| 好看的av在线| 久久先锋资源网| 日韩欧美在线播放视频| 欧美挤奶吃奶水xxxxx| 午夜欧美大片免费观看| 日本黄色三级视频| 一区二区三区美女视频| 特种兵之深入敌后| 欧美精品一线| 国产乱码精品一区二区三区卡| 欧美aaaaaaa| 精品国产伦一区二区三区观看方式 | 天天躁日日躁狠狠躁喷水| 五月天激情小说综合| 懂色av粉嫩av蜜乳av| 99视频精品| 欧美日韩电影一区二区| 日本综合字幕| 日韩中文字幕在线看| 91欧美日韩麻豆精品| 亚洲人亚洲人成电影网站色| 无码人妻一区二区三区免费n鬼沢| 亚洲情侣在线| 成人免费在线一区二区三区| 都市激情国产精品| 亚洲欧美日韩一区二区三区在线| 波多野结衣啪啪| 国产精品午夜久久| 久久aaaa片一区二区| 亚洲视频观看| 麻豆精品传媒视频| 韩国成人在线| 久久国产精品电影| 偷拍自拍在线| 欧美日韩一区不卡| 欧美日韩国产精品综合| 99久久久国产精品免费蜜臀| 青青青国产在线视频| 欧美电影三区| 国产精品一区二| 亚洲成人看片| 欧美另类在线播放| 少妇激情av一区二区| 欧美揉bbbbb揉bbbbb| 欧美丰满艳妇bbwbbw| 91蜜桃在线免费视频| 激情黄色小视频| 亚洲麻豆视频| 二级片在线观看| 久久男人av| 成人欧美一区二区三区在线 | 午夜亚洲福利老司机| 亚洲精品一区二区三区影院忠贞| 国产精品系列在线播放| 欧美极品欧美精品欧美图片| 91tv精品福利国产在线观看| 蜜桃麻豆www久久国产精品| 自拍偷拍欧美日韩| 91高清视频在线免费观看| 91大神xh98hx在线播放| 亚洲第一区中文99精品| 在线观看中文字幕网站| 性做久久久久久免费观看欧美| 国产又粗又猛又爽又黄的视频四季 | 亚洲free性xxxx护士白浆| 日韩伦理精品| 色综合久久精品亚洲国产 | 精品三级av在线导航| 国产欧美日韩免费| 625成人欧美午夜电影| 久久中文字幕在线| 北岛玲一区二区三区| 日韩av在线一区| www.国产麻豆| 欧美麻豆精品久久久久久| 日韩毛片一区二区三区| 一区二区三区四区乱视频| 又嫩又硬又黄又爽的视频| 91蜜桃视频在线| 色哟哟视频在线| 国产美女av一区二区三区| 免费看污污网站| 视频一区欧美精品| av动漫在线看| 91久久夜色精品国产九色| a级网站在线观看| 久久看人人摘| 午夜老司机精品| 欧美禁忌电影| 久久久久高清| 秋霞蜜臀av久久电影网免费| 国产精品成人一区二区三区 | 欧美一区二区三区男人的天堂| 亚洲精品无码久久久久| 日韩欧美在线观看| 精品成人av一区二区在线播放| 亚洲国产毛片aaaaa无费看| 九九免费精品视频| 亚洲欧美日韩国产另类专区 | 国产系列在线观看| 国产午夜精品久久久 | 久久夜色精品国产欧美乱| 尤物网址在线观看| 日韩中文字幕在线| 国内精品久久久久久野外| 精品国内亚洲在观看18黄| 老司机午夜在线| 麻豆乱码国产一区二区三区| 国产黄网站在线观看| 九九九热精品免费视频观看网站| 黄色网址视频在线观看| 欧美成人午夜激情在线| 天堂av中文在线| 97在线视频观看| 亚洲女同av| 国产精品99久久久久久www| 亚洲天堂一区二区| 国产精品日日摸夜夜添夜夜av| 欧美一区=区三区| 亚洲一区二区久久久久久久| 亚洲超碰在线观看| 国产精品国产三级国产专区53 | 99热这里只有精品免费| 欧美日韩ab| 国产成人在线免费看| 久久资源在线| 制服丝袜中文字幕第一页| 国产二区国产一区在线观看| 久久精品女同亚洲女同13| 国产日韩欧美精品一区| 三级黄色录像视频| 一级日本不卡的影视| 影音先锋亚洲天堂| 欧美撒尿777hd撒尿| 亚洲成人av综合| 亚洲女人天堂色在线7777| 久久综合之合合综合久久| 欧美激情综合色| 视频二区不卡| 51国偷自产一区二区三区| 国产成人福利av| 亚洲高清视频一区二区| 中出一区二区| 欧美性大战久久久久xxx| 美女视频网站久久| 亚洲精品无码一区二区| 国产欧美一区二区三区在线老狼| 99热99这里只有精品| 性欧美大战久久久久久久久| 精品一区二三区| 精品国产乱码久久久久久久 | 欧美第一黄网免费网站| 午夜精品成人av| 91亚洲精品丁香在线观看| 中文字幕伦av一区二区邻居| 日韩video| 日日摸夜夜添夜夜添国产精品| 日韩精品视频网址| 久久久久久久久免费| 欧美日韩偷拍视频| 欧美日韩视频在线第一区 | 国产精品视频一二区| 日韩精品久久久久久久玫瑰园| 国产不卡在线| 国产激情视频一区| 久久久久久毛片免费看 | 日韩一区二区精品| 黄色在线视频观看网站| 欧美精品激情在线| 亚洲高清影院| 日韩av一级大片| 亚洲综合另类| 91人妻一区二区| 亚洲女与黑人做爰| 亚洲综合免费视频| 亚洲欧美成人精品| 2020日本在线视频中文字幕| 成人美女免费网站视频| 精品国产一区二区三区久久久樱花| 女人帮男人橹视频播放| 国产一区二区免费视频| 欧美性猛交xxxx乱大交少妇| 日本韩国欧美一区| 亚洲AV成人无码一二三区在线| 色综合色综合网色综合| 91成人app| 尤物一区二区三区| 美女视频网站久久| 国产欧美一区二区三区在线观看视频 | 一区二区三区精品国产| 日产国产欧美视频一区精品| 中文字幕在线看高清电影| 午夜影视日本亚洲欧洲精品| 黄色一级a毛片| 久久久久久com| 日韩一二三区| 五月天激情图片| 国产一本一道久久香蕉| 日韩一级片av| 日韩三级精品电影久久久| www视频在线免费观看| 91青草视频久久| 一区二区在线影院| 欧美激情国内自拍| 亚洲精品成人天堂一二三| 国产日韩在线观看一区| 欧美成人午夜激情在线| 97视频一区| 999在线观看视频| 99精品偷自拍| 日韩av大片在线观看| 亚洲欧洲国产一区| jizz亚洲女人高潮大叫| 在线成人性视频| 国产精品资源在线| 免费无码毛片一区二区app| 亚洲国产高潮在线观看| 深夜成人在线| 亚洲bbw性色大片| 极品美女销魂一区二区三区免费| 青青操在线视频观看| 精品福利一区二区三区| 麻豆网站免费在线观看| 日本一区二区不卡高清更新| 奇米888四色在线精品| 91人妻一区二区三区蜜臀| 日韩女同互慰一区二区| 国产粉嫩在线观看| 日韩国产欧美精品| 精品一区二区三区久久| 久久影院一区二区| 精品视频在线导航| 欧美a一级片| av网站大全免费| 国产人妖乱国产精品人妖| 国产免费一区二区三区最新不卡| 欧美激情手机在线视频 | 亚洲视频在线播放| 激情欧美一区二区三区黑长吊| 18视频在线观看娇喘| 99久久精品免费观看| 国产黄色免费视频| 欧美成人免费大片| 亚洲资源网站| www.超碰97.com| 欧美日韩激情网| 黄色小网站在线观看| 久久国产主播精品| 久久99蜜桃精品| 粉嫩aⅴ一区二区三区| 日日骚久久av| 欧美成人一区在线观看| 一区二区免费av| 欧美午夜久久久| 色在线视频网| 亚洲一区三区在线观看| 99热在这里有精品免费| 国产一区二区在线视频聊天| 欧美亚洲另类激情另类|