背景
GaussDB是華為公司傾力打造的自研企業級分布式關系型數據庫,該產品具備企業級復雜事務混合負載能力,同時支持優異的分布式事務,同城跨AZ部署,數據0丟失,支持1000+擴展能力,PB級海量存儲等企業級數據庫特性。擁有云上高可用,高可靠,高安全,彈性伸縮,一鍵部署,快速備份恢復,監控告警等關鍵能力,能為企業提供功能全面,穩定可靠,擴展性強,性能優越的企業級數據庫服務。
一、建立合適的索引
在這個Codelabs中,您將體驗GaussDB通過建立合適的索引來達到性能調優的實際案例。
1、SQL調優指南
SQL調優的唯一目的是“資源利用最大化”,即CPU、內存、磁盤IO、網絡IO四種資源利用最大化。所有調優手段都是圍繞資源使用開展的。所謂資源利用最大化是指SQL語句盡量高效,節省資源開銷,以最小的代價實現最大的效益。比如做典型點查詢的時候,可以用seqscan+filter(即讀取每一條元組和點查詢條件進行匹配)實現,也可以通過indexscan實現,顯然indexscan可以以更小的代價實現相同的效果。
2、建立合適的索引
a. 現象描述
查詢與銷售部所有員工的信息:
SELECT staff_id,first_name,last_name,employment_id,state_name,city
FROM staffs,sections,states,places
WHERE sections.section_name='Sales'
AND staffs.section_id = sections.section_id
AND sections.place_id = places.place_id
AND places.state_id = states.state_id
ORDER BY staff_id;
b. 優化分析
在優化前,沒有創建places.place_id和states.state_id索引,執行計劃如下:
建議在places.place_id和states.state_id列上建立2個索引,執行計劃如下:
祝賀您,您已經成功地完成了GasssDB通過建立合適的索引來達到性能調優全流程體驗。
3、參考
更多信息請參考GasssDB文檔
?
?二、SQL調優之改寫SQL消除子查詢
在這個Codelabs中,您將體驗GaussDB通過改寫SQL消除子查詢來達到性能調優的實際案例。
1、SQL調優指南
SQL調優的唯一目的是“資源利用最大化”,即CPU、內存、磁盤IO、網絡IO四種資源利用最大化。所有調優手段都是圍繞資源使用開展的。所謂資源利用最大化是指SQL語句盡量高效,節省資源開銷,以最小的代價實現最大的效益。比如做典型點查詢的時候,可以用seqscan+filter(即讀取每一條元組和點查詢條件進行匹配)實現,也可以通過indexscan實現,顯然indexscan可以以更小的代價實現相同的效果。
2、改寫SQL消除子查詢
a. 現象描述
表定義如下:
select 1, (select count(*) from customer_address_001 a4 where a4.ca_address_sk = a.ca_address_sk) as GZCS
from customer_address_001 a;
?此SQL性能較差,查看發現執行計劃中存在SubPlan,具體如下:
b. 優化說明
此優化的核心就是消除子查詢。分析業務場景發現a.ca_address_sk不為null,那么從SQL語義出發,可以等價改寫SQL為:
select
count(*)
from customer_address_001 a4, customer_address_001 a
where a4.ca_address_sk = a.ca_address_sk
group by a.ca_address_sk;
說明: 為了保證改寫的等效性,在customer_address_001. ca_address_sk加了not null約束。
c. 現象描述
某局點客戶反饋如下SQL語句的執行時間超過1天未結束:
UPDATE calc_empfyc_c_cusr1 t1
SET ln_rec_count = ( SELECT CASE WHEN current_date - ln_process_date + 1 <= 12 THEN 0 ELSE t2.ln_rec_count END FROM calc_empfyc_c1_policysend_tmp t2 WHERE t1.ln_branch = t2.ln_branch AND t1.ls_policyno_cusr1 = t2.ls_policyno_cusr1
)
WHERE dsign = '1'
AND flag = '1'
AND EXISTS (SELECT 1 FROM calc_empfyc_c1_policysend_tmp t2 WHERE t1.ln_branch = t2.ln_branch AND t1.ls_policyno_cusr1 = t2.ls_policyno_cusr1 );
?
d. 優化說明
很明顯,執行計劃中存在SubPlan,并且SubPlan中的運算相當重,即此SubPlan是一個明確的性能瓶頸點。 根據SQL語意等價改寫SQL消除SubPlan如下:
UPDATE calc_empfyc_c_cusr1 t1
SET ln_rec_count = CASE WHEN current_date - ln_process_date + 1 <= 12 THEN 0 ELSE t2.ln_rec_count END
FROM calc_empfyc_c1_policysend_tmp t2
WHERE
t1.dsign = '1' AND t1.flag = '1'
AND t1.ln_branch = t2.ln_branch AND t1.ls_policyno_cusr1 = t2.ls_policyno_cusr1;
改寫之后SQL語句在50S內執行完成。
祝賀您,您已經成功地完成了GasssDB通過改寫SQL消除子查詢來達到性能調優全流程體驗。
參考
更多信息請參考GasssDB文檔
本篇為大家分享到這里,歡迎交流~?