WEDCV155VD5RRV515DV

 

本文轉載自dbaplus社群 標量子查詢由於需要傳值,因此它和嵌套循環連接類似,被驅動表會被掃描N次。SQL語句中的主結果集為驅動表,標量查詢為被驅動表,被驅動表的執行次數為主結果集在連接列上distinct值的數量,例如一條帶標量子查詢的SQL語句: select ename, (select dname from dept d where d.deptno = e.deptno) dname from emp e where e.job in ('SALESMAN', 'ANALYST'); 用偽代碼可以表示為: for i in (select distinct deptno from emp e where e.job in ('SALESMAN', 'ANALYST')): select dname from dept d where d.deptno = i; 標量部分的執行次數可通過SQL語句計算出: selet count(distinct deptno ) from emp e where e.job in ('SALESMAN', 'ANALYST'); 二、標量子查詢易產生的性能問題 結合偽代碼,通常來說帶有標量子查詢的SQL語句易產生性能問題的地方有三點: 1、主查詢過濾結果集時的效率,在上述例子中,是指對主表emp基於job欄位進行過濾時的性能,如果訪問路徑較差,例如全表掃描、錯誤的索引掃描,易產生性能問題; 2、主查詢過濾結果集後返回的數據量較大(這裡的數據量指的是連接列的唯一值),會導致標量部分多次查詢,即使標量的訪問路徑為INDEX UNIQUE SCAN,也容易因為較多的查詢次數產生性能問題; 3、標量部分的查詢效率,如果標量部分的訪問路徑較差,易引起性能問題。 三、標量子查詢常規優化方案 介紹了標量子查詢的特點後,接下來聊聊優化的問題,通常來說,當標量子查詢存在性能問題時,可採取的優化方案主要有3種方式: 1、對於查詢語句中的標量子查詢,通常使用left join改寫,當然,如果標量部分與主表在連接列上為主鍵、外鍵關係時,可以改寫為inner join,進一步提升性能; 2、對於update語句中的標量子查詢,通常使用merge語句改寫; 3、在某些環境下不能改寫時,可通過索引手段優化標量部分的訪問路徑、連接方式; 個人建議優先選擇改寫優化,因為改寫最大的優勢是可以控制執行計劃,改變標量的連接方式(例如通過Hint、profile或者讓優化器自己去選擇),當某些環境下無法改變SQL語句時,再通過索引方式優化。 四、案例分析 本小節分享3個實際工作中遇到的標量子查詢改寫優化案例,3個案例分別是: 案例1:select語句中的標量子查詢改寫; 案例2:where語句後的標量子查詢改寫; 案例3:update語句中的標量子查詢改寫; 案例1:select中的標量子查詢 該案例為數倉平臺中的報表SQL,總執行時間約2分鐘左右,主表order加上過濾條件並group by後,返回數據量約160萬。 真實執行計劃顯示,這一步僅耗時不到2秒,大部分時間耗費在ID=3-access(「TT」.」ORDER_ID」=:B1),體現在SQL語句中,則是標量部分的SELECT COUNT(1) from dhoe tt where tt.order_id = t.order_id,由於主表返回的數據量在連接列distinct值較多,導致標量部分掃描的次數較多(約160萬),造成性能瓶頸。 select t.num_id, t.create_time, 1 if_3to4, max(case when (select count(1) from dhoe tt where tt.order_id = t.order_id and tt.otype = '101') > 0 then 0 and tt.otype = '102') > 0 then 1 else 0 end) if_hk from order t where off_rype = '9601' group by t.num_id, t.create_time; ... 對於select語句後的標量子查詢,我們通常使用left join或者inner join方式改寫,在該案例中,標量部分的表dhoe與主表order在連接列order_id上不存在主外鍵關係,因此只能使用left join改寫,改寫時只需將標量部分在連接列上進行分組,將結果提前計算後與主表做關聯即可。 改寫後,優化器選擇將主表與原先的標量查詢做哈希外連接,每個表只訪問一次即可完成查詢,大大減少了物理I/O次數。 當然,並不是改寫後優化器一定會選擇哈希外連接,在某些情況下(如統計信息、特殊查詢干擾優化器對rows的估算等等),優化器也會選擇與改寫後的標量視圖做連接列謂詞推入,從而導致改寫後的標量視圖做被驅動表與主表進行嵌套循環連接,這種執行計劃通常要比標量寫法還要差,因此改寫完後我們仍需要檢查下執行計劃有沒有問題。 select num_id, create_time, 1 if_3to4, max(case when b.cnt101 > 0 then 0 when c.cnt102 > 0 then 1 else 0 end) if_hk from (select t.num_id, t.create_time, 1 if_3to4, order_id from order t where off_rype = '9601') a left outer join (select order_id, count(case when otype = '101' then 1 end) cnt101, when otype = '102' then end) cnt102 from dhoe group by order_id) b > group by num_id, create_time; ... 案例2:where後的標量子查詢 where後面有標量子查詢時,由於需要傳值,標量部分同樣需要執行N次,只不過在執行計劃中會出現關鍵字Filter,這一點和select後的標量子查詢執行計劃有點區別,但是運算方式是一樣的,Filter的驅動表為主結果集,被驅動表為標量子查詢。 該案例是大屏定時刷新頁面的SQL語句,每次執行耗時52秒,通過真實執行計劃可看到,大部分時間耗費在標量部分的傳值計算中: select count(*) from wp_info ws inner join wp_center wa > where ws.status = 'VALID' and wa.is_del = 'V' and (select count(1) from wp_bas wb left join wp_rep wr > where wb.WP_STATUS in (2, 3, 4) and wr.is_valid = 'VALID' and wr.created > sysdate - 7 and wr.service_no = ws.num) < ws.total_num; ... 與select中標量子查詢的改寫方式一致:標量部分按連接列分組提前將結果計算好後與主結果集做left join即可,在這個案例中,需要注意使用nvl函數對改寫後的標量欄位空值處理後再進行比較:and nvl(cc.cnt, 0) < ws.total_num from wp_info ws inner join wp_center wa > left join (select wr.service_no, count(1) cnt from wp_bas wb left join wp_rep wr on wr.id = wb.id where wb.WP_STATUS in (2, 3, 4) and wr.is_valid = 'VALID' and wr.created > sysdate - 7 group by wr.service_no) cc > where ws.status = 'VALID' and wa.is_del = 'V' and nvl(cc.cnt, 0) < ws.total_num; ... 這裡跟大家聊聊另外一種思路:在某些情況下,我們可以使用with+materialize物化的方式對標量的計算過程進行優化,這樣改寫優點就是簡單方便,可以減少每次計算標量部分帶來的性能開銷,缺點則是它不能像left join改寫那樣控制執行計劃,即無法改變被驅動表的執行次數。 對於案例二,用with+materialize方式的改寫方案如下: with t as (select /*+ materialize */ wr.service_no from wp_bas wb left join wp_rep wr > where wb.WP_STATUS in (2, 3, 4) and wr.is_valid = 'VALID' and wr.created > sysdate - 7) select count(*) from wp_info ws left join wp_center wa > where ws.status = 'VALID' and wa.is_del = 'V' and (select count(1) from t wr where wr.service_no = ws.num) < ws.total_num; ... 案例3:update中的標量子查詢 update set語句後面有傳值時,也會導致子查詢被掃描N次,通常使用merge語句進行改寫,使用merge語句改寫時,需要注意關聯條件的寫法。 該案例的更新語句每次執行耗時約20分鐘,通過真實執行計劃可以看到,標量部分執行了257次是該SQL語句的性能瓶頸: UPDATE RE_RPT A SET A.TCNT = (SELECT NVL(SUM(G.REDCODE), 0) FROM RP_GRANT G, (SELECT DISTINCT REDCODE, REDCODE_MD5 FROM RP_SCAN) S, IMT_CODE V, (SELECT DISTINCT W_ID, NAME FROM MATER WHERE SUBSTR(ORDER, 1, 2) = 'OF' AND W_ID IS NOT NULL) M WHERE G.REDCODE = S.REDCODE AND S.REDCODE_MD5 = V.N_CODE AND V.W_CODE = M.W_ID AND G.RP_CLASS = '有效' AND G.CREATE_DATE = '2018-05-05' AND A.NAME = M.NAME) WHERE A.CHOOSE_TIME = '2018-05-05'; ... 通過以下查詢也可以計算出標量執行次數: SQL> select count(distinct NAME) 2 from RE_RPT A 3 WHERE A.CHOOSE_TIME='2018-05-05'; COUNT(DISTINCTNAME) 257 由於該語句每次執行時,是對每日數據進行全量更新,因此merge語句的關聯條件可以寫為外連接的方式:A.NAME = M.NAME(+) MERGE INTO (select * from RE_RPT A WHERE A.CHOOSE_TIME = '2018-05-05') A USING (SELECT M.NAME, SUM(G.REDCODE) SUM_CODE FROM RP_GRANT G, (SELECT DISTINCT REDCODE, REDCODE_MD5 FROM RP_SCAN) S, IMT_CODE V, (SELECT DISTINCT W_ID, NAME FROM MATER WHERE SUBSTR(ORDER, 1, 2) = 'OF' AND W_ID IS NOT NULL) M WHERE G.REDCODE = S.REDCODE AND S.REDCODE_MD5 = V.N_CODE AND V.W_CODE = M.W_ID AND G.RP_CLASS = '有效' AND G.CREATE_DATE = '2018-05-05') group by M.NAME) M ON (A.NAME = M.NAME(+)) when matched then update set A.TCNT = nvl(SUM_CODE, 0); ... 五、總結 本文主要跟大家介紹了標量子查詢的特點,並結合實際工作中遇到的3個案例聊了下通用的改寫方案,如果一條SQL語句的性能瓶頸在標量子查詢,那麼可以通過改寫SQL來改變主表與標量子查詢的連接方式,或者通過建立索引優化標量部分的訪問路徑,本質都是一樣的:減少物理I/O次數,達到提升性能的目的。 從過去40年至今,資料庫的形態基本經歷了傳統商業資料庫、開源資料庫到雲原生資料庫的演進過程。雲時代下資料庫將如何革新與創變?金融行業核心資料庫遷移與建設如何安全平穩展開?來Gdevops全球敏捷運維峰會北京站尋找答案: 《All in Cloud 時代,下一代雲原生資料庫技術與趨勢》阿里巴巴集團副總裁/達摩院首席資料庫科學家 李飛飛(飛刀) 《AI和雲原生時代的資料庫進化之路》騰訊資料庫產品中心總經理 林曉斌(丁奇) 《ICBC的MySQL探索之路》工商銀行軟體開發中心 魏亞東 《金融行業MySQL高可用實踐》愛可生技術總監 明溪源 《OceanBase分布式資料庫在西安銀行的落地和實踐》螞蟻金服P9資深專家/OceanBase核心負責人 蔣志勇

 

 

內容簡介

  試試看,你要花多少時間才能準確記住以下這一串數字
  3627501243901479686904210639169589605743076585028

  10分鐘能做到嗎?很多人都可能會搖頭,因為這串枯燥的數字看起來實在是太長了--共有49個號碼!

  要想進行有效的記憶,單純靠死記硬背是行不通的,必須得尋找一些竅門!假如你熟悉了,就會變得非常容易。任何人只要掌握了科學的記憶方法,都能有效增強記憶力。」

  或許大部分人會覺得這種記憶能力實在神奇,對自己來說完全是可望而不可及的。然而,記憶力並不是單純的天賦,而是後天鍛煉的結果。

  「梅以寒而茂,荷以暑而清」,艱辛而科學地培植,長期而堅持的訓練,才能夠結出美麗的記憶之花。只有在學習和掌握科學的記憶方法的基礎上,結合本身的特點和實際需要,進行持之以恆地訓練,才能真正把自己大腦的潛能發揮出來!

目錄

第一章 人人都能有效提高記憶力
包括記憶能力在內的人的潛力是非常巨大的。世界上記憶知識最多的人,可能也僅僅開發了他的記憶潛力的1%。人腦有很大的潛力,通過一定的訓練,你可以改善你的記憶力,記住很多你以前不敢想像能夠記住的東西。發展良好記憶的秘密,在於學會怎樣把有用的信息從短期記憶轉化為長期記憶,並在需要時,把它們再現出來。

人的大腦猶如一座等待開發的巨大寶庫
記憶方法是任何人都應該掌握也能夠掌握的
記憶的概念和衡量記憶力好壞的標準
人腦是怎樣學習和記憶的
記憶的基本過程、規律和類型
感覺記憶的特點和功能
短時記憶的顯著特點
長時記憶的特點和類型
記憶的效果取決於主客觀兩種因素
對識記材料常見的組織加工方式
長時記憶的儲存及其可能變化
長時記憶的提取及其影響因素
根據記憶內容的不同對記憶的分類
要認識和擺脫的一些記憶方面的誤區

第二章 綜合運動全腦進行學習、記憶和思維
人腦分兩個半球,左腦和右腦,人的左右腦有不同的分工,左腦主要負責邏輯思維,如文字處理、數學計算等。右腦主要負責綜合性判斷和感觀認知。左腦和右腦又分為言語—語言智力、邏輯—數理智力、自知—自省智力、音樂—節奏智力、視覺—空間智力、身體—動覺智力、交往—交流智力和自然觀察智力八大智力區域。通過眼、耳、手、口、心的活動等多種方式,盡量充分調動所有的智力區域積極參與,才能發揮大腦潛能,最大限度地提高學習和記憶能力。

開發動員全腦參與學習效果最好
要重視對注意力的培養和提高
通過訓練進入專注忘我的世界
沒有較強的觀察力就很難提高記憶力
掌握科學的觀察方法和要領
有助於提高觀察技巧的專門訓練
通過訓練開闊視野的幅度
多種感知覺參與的多通道記憶法效果更好
要有意識地促進右腦的活性化
聽覺刺激是能力開發最重要的工具
完整地聽取聲音信號是語言學習的基礎
堅持朗讀和背誦能增進記憶力
通過對聽覺的訓練來提高記憶力
努力提高氣味的辨別技巧
把自己的觸覺訓練得更好

第三章 理解是記憶的基礎,聯想是記憶的關鍵
不管是哪方面的信息,僅僅靠死記硬背都是枯燥和乏味的。也許我們都會有這樣的體驗,要牢牢地記住單純的幾個詞或幾句話有時非常困難。很容易忘記,但如果在記憶這些詞和句子時,能看到相關的圖片或小故事,記憶起來就輕鬆多了,而且不容易忘記。這揭示了記憶的一個原理:有意義的知識是很容易記憶的。對於那些看似沒有意義的詞句,就要充分發揮靈活的思維和豐富的聯想、想像能力了。

深入的理解是記憶的前提和基礎
採用有助於更好地記憶的閱讀方法
進行理解能力的測試和訓練
一定要在理解的基礎上記憶
在閱讀的過程中要勤於思考
堅持思索和權衡的正確讀書法
在日常生活中發展自己的思維能力
使聯想思維成為開啟思路的導火索和催化劑
掌握常見的比較實用的聯想方式
為提高記憶效率在聯想的過程中要加入一些要素
對想像能力進行有意識的培養
通過專門的訓練有效地開發想像力

 

詳細資料

  • ISBN:9789868798298
  • 叢書系列:
  • 規格:平裝 / 240頁 / 15 x 21 x 1.2 cm / 普通級 / 單色印刷 / 初版
  • 出版地:台灣
  • 本書分類:> >

 

 

 

 

 

文章來源取自於:

壹讀 https://read01.com/AzgRnkj.html

博客來 https://www.books.com.tw/exep/assp.php/888words/products/0010554342

如有侵權,請來信告知,我們會立刻下架。

DMCA:dmca(at)kubonews.com

聯絡我們:contact(at)kubonews.com


二水恐慌改善中醫診所員林白天賴床睏倦中醫推薦集集白天賴床睏倦治療中醫
和美睡不著治療有效中醫診所 溪州手抖治療有效中醫診所 ptt推薦的員林中醫診所,睡眠障礙改善很多大村胃脹治療中醫 仁愛鄉倦怠、疲勞改善中醫診所 ptt推薦的彰化中醫診所,睡眠障礙改善很多永靖味覺異常看什麼科 溪州肌肉緊繃治療中醫 這間和美中醫診所很大推,睡眠障礙改善很多水里腎臟功能異常治療中醫 彰師大附近推薦強迫症看什麼科 鹿港中醫診所這間很大推,失眠睡不著改善很多

arrow
arrow
    全站熱搜

    嚴選一批好物 發表在 痞客邦 留言(0) 人氣()