WEFV2626EFCEYYYB15VEF

 

內容簡介

本書作者筆名杭之,為一知名的民間學者,對於社會科學各種重要理論鑽研甚深。本書首就資本主義國家的一般特質,以及技術官僚規劃的知識基礎加以析論,次就歷史結構的角度檢查台灣國家性質的演變,及其政策制定之間的關係;最後以公共設施保留地為個案。說明在邊陲資本主義發展的結構性脈絡中,都市問題的起因與特質。全書之論述結構至為嚴謹,說明清晰。

詳細資料

  • ISBN:9576834805
  • 規格:平裝 / 95頁 / 普通級 / 單色印刷 / 初版
  • 出版地:台灣
  • 本書分類:> >

 

 

本文轉載自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核心負責人 蔣志勇

 

 

WEFV2626EFCEYYYB15VEF

 

 

 

文章來源取自於:

 

 

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

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

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

DMCA:dmca(at)kubonews.com

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


新社霧感流行髮色上班族染髮推薦髮廊和平柔霧帶柔焦光推薦髮廊大雅兩側漸層髮型專業染髮燙髮髮廊和平型男剪裁推薦染髮店
大甲染出滿意的髮色學生染髮推薦髮廊 后里微卷髮型修改推薦髮廊 台中哥德式護髮染髮推薦霧峰油頭造型推薦髮廊推薦髮型設計工作室 台中北區內彎髮型修改推薦髮廊專業剪髮推薦髮廊 台中男士理髮推薦台中中區髮色去色處理推薦髮型設計工作室 一中商圈推薦油頭的露額側分髮型專業染髮燙髮髮廊 Dcard推薦的台中護髮染髮燙髮推薦烏日微卷髮型修改推薦髮廊 大肚秋冬髮色怎麼選推薦染髮髮廊 韓式氣墊燙台中燙髮推薦

arrow
arrow
    全站熱搜

    優惠好康分享 發表在 痞客邦 留言(0) 人氣()