openGauss學(xué)習(xí)筆記-236 openGauss性能調(diào)優(yōu)-SQL調(diào)優(yōu)-Query執(zhí)行流程236.1 Query執(zhí)行流程236.1.1 調(diào)優(yōu)手段之統(tǒng)計(jì)信息236.1.2 調(diào)優(yōu)手段之GUC參數(shù)236.1.3 調(diào)優(yōu)手段之底層存儲(chǔ)236.1.4 調(diào)優(yōu)手段之SQL重寫
openGauss學(xué)習(xí)筆記-236 openGauss性能調(diào)優(yōu)-SQL調(diào)優(yōu)-Query執(zhí)行流程
SQL調(diào)優(yōu)的唯一目的是“資源利用最大化”,即CPU、內(nèi)存、磁盤IO三種資源利用最大化。所有調(diào)優(yōu)手段都是圍繞資源使用開展的。所謂資源利用最大化是指SQL語句盡量高效,節(jié)省資源開銷,以最小的代價(jià)實(shí)現(xiàn)最大的效益。比如做典型點(diǎn)查詢的時(shí)候,可以用seqscan+filter(即讀取每一條元組和點(diǎn)查詢條件進(jìn)行匹配)實(shí)現(xiàn),也可以通過indexscan實(shí)現(xiàn),顯然indexscan可以以更小的代價(jià)實(shí)現(xiàn)相同的效果。
根據(jù)硬件資源和客戶的業(yè)務(wù)特征確定合理的openGauss部署方案和表定義是數(shù)據(jù)庫在多數(shù)情況下滿足性能要求的基礎(chǔ)。下文的調(diào)優(yōu)說明假設(shè)您已根據(jù)“軟件安裝”指引在安裝過程中按照合理的openGauss方案完成了安裝,且已經(jīng)根據(jù)“開發(fā)設(shè)計(jì)建議”的指引進(jìn)行了數(shù)據(jù)庫設(shè)計(jì)。
236.1 Query執(zhí)行流程
SQL引擎從接受SQL語句到執(zhí)行SQL語句需要經(jīng)歷的步驟如圖1和表1所示。其中,紅色字體部分為DBA可以介入實(shí)施調(diào)優(yōu)的環(huán)節(jié)。
圖 1 SQL引擎執(zhí)行查詢類SQL語句的流程 [圖片上傳失敗...(image-852688-1709632755627)]
表 1 SQL引擎執(zhí)行查詢類SQL語句的步驟說明
| 步驟 | 說明 |
|---|---|
| 1、語法&詞法解析 | 按照約定的SQL語句規(guī)則,把輸入的SQL語句從字符串轉(zhuǎn)化為格式化結(jié)構(gòu)(Stmt)。 |
| 2、語義解析 | 將“語法&詞法解析”輸出的格式化結(jié)構(gòu)轉(zhuǎn)化為數(shù)據(jù)庫可以識(shí)別的對(duì)象。 |
| 3、查詢重寫 | 根據(jù)規(guī)則把“語義解析”的輸出等價(jià)轉(zhuǎn)化為執(zhí)行上更為優(yōu)化的結(jié)構(gòu)。 |
| 4、查詢優(yōu)化 | 根據(jù)“查詢重寫”的輸出和數(shù)據(jù)庫內(nèi)部的統(tǒng)計(jì)信息規(guī)劃SQL語句具體的執(zhí)行方式,也就是執(zhí)行計(jì)劃。統(tǒng)計(jì)信息和GUC參數(shù)對(duì)查詢優(yōu)化(執(zhí)行計(jì)劃)的影響,請(qǐng)參見調(diào)優(yōu)手段之統(tǒng)計(jì)信息和調(diào)優(yōu)手段之GUC參數(shù)。 |
| 5、查詢執(zhí)行 | 根據(jù)“查詢優(yōu)化”規(guī)劃的執(zhí)行路徑執(zhí)行SQL查詢語句。底層存儲(chǔ)方式的選擇合理性,將影響查詢執(zhí)行效率。詳見調(diào)優(yōu)手段之底層存儲(chǔ)。 |
236.1.1 調(diào)優(yōu)手段之統(tǒng)計(jì)信息
openGauss優(yōu)化器是典型的基于代價(jià)的優(yōu)化(Cost-Based Optimization,簡(jiǎn)稱CBO)。在這種優(yōu)化器模型下,數(shù)據(jù)庫根據(jù)表的元組數(shù)、字段寬度、NULL記錄比率、distinct值、MCV值、HB值等表的特征值,以及一定的代價(jià)計(jì)算模型,計(jì)算出每一個(gè)執(zhí)行步驟的不同執(zhí)行方式的輸出元組數(shù)和執(zhí)行代價(jià)(cost),進(jìn)而選出整體執(zhí)行代價(jià)最小/首元組返回代價(jià)最小的執(zhí)行方式進(jìn)行執(zhí)行。這些特征值就是統(tǒng)計(jì)信息。從上面的描述可以看出統(tǒng)計(jì)信息是查詢優(yōu)化的核心輸入,準(zhǔn)確的統(tǒng)計(jì)信息將幫助規(guī)劃器選擇最合適的查詢規(guī)劃。一般來說我們會(huì)通過ANALYZE語法收集整個(gè)表或者表的若干個(gè)字段的統(tǒng)計(jì)信息,周期性地運(yùn)行ANALYZE,或者在對(duì)表的大部分內(nèi)容做了更改之后馬上運(yùn)行ANALYZE。
236.1.2 調(diào)優(yōu)手段之GUC參數(shù)
查詢優(yōu)化的主要目的是為查詢語句選擇高效的執(zhí)行方式。
如下SQL語句:
select count(1)
from customer inner join store_sales on (ss_customer_sk = c_customer_sk);
在執(zhí)行customer inner join store_sales的時(shí)候,openGauss支持Nested Loop、Merge Join和Hash Join三種不同的Join方式。優(yōu)化器會(huì)根據(jù)表customer和表store_sales的統(tǒng)計(jì)信息估算結(jié)果集的大小以及每種join方式的執(zhí)行代價(jià),然后對(duì)比選出執(zhí)行代價(jià)最小的執(zhí)行計(jì)劃。
正如前面所說,執(zhí)行代價(jià)計(jì)算都是基于一定的模型和統(tǒng)計(jì)信息進(jìn)行估算,當(dāng)因?yàn)槟承┰虼鷥r(jià)估算不能反映真實(shí)的cost的時(shí)候,我們就需要通過guc參數(shù)設(shè)置的方式讓執(zhí)行計(jì)劃傾向更優(yōu)規(guī)劃。
236.1.3 調(diào)優(yōu)手段之底層存儲(chǔ)
openGauss的表支持行存表、列存表,底層存儲(chǔ)方式的選擇嚴(yán)格依賴于客戶的具體業(yè)務(wù)場(chǎng)景。一般來說計(jì)算型業(yè)務(wù)查詢場(chǎng)景(以關(guān)聯(lián)、聚合操作為主)建議使用列存表;點(diǎn)查詢、大批量UPDATE/DELETE業(yè)務(wù)場(chǎng)景適合行存表。
對(duì)于每種存儲(chǔ)方式還有對(duì)應(yīng)的存儲(chǔ)層優(yōu)化手段,這部分會(huì)在后續(xù)的調(diào)優(yōu)章節(jié)深入介紹。
236.1.4 調(diào)優(yōu)手段之SQL重寫
除了上述干預(yù)SQL引擎所生成執(zhí)行計(jì)劃的執(zhí)行性能外,根據(jù)數(shù)據(jù)庫的SQL執(zhí)行機(jī)制以及大量的實(shí)踐發(fā)現(xiàn),有些場(chǎng)景下,在保證客戶業(yè)務(wù)SQL邏輯的前提下,通過一定規(guī)則由DBA重寫SQL語句,可以大幅度的提升SQL語句的性能。
這種調(diào)優(yōu)場(chǎng)景對(duì)DBA的要求比較高,需要對(duì)客戶業(yè)務(wù)有足夠的了解,同時(shí)也需要扎實(shí)的SQL語句基本功,后續(xù)會(huì)介紹幾個(gè)常見的SQL改寫場(chǎng)景。
?? 點(diǎn)贊,你的認(rèn)可是我創(chuàng)作的動(dòng)力!
?? 收藏,你的青睞是我努力的方向!
?? 評(píng)論,你的意見是我進(jìn)步的財(cái)富!
