W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
執(zhí)行計劃緩存(Plan Cache)用于減少執(zhí)行計劃的生成次數(shù)。
OceanBase 數(shù)據(jù)庫會緩存之前生成的執(zhí)行計劃,以便在下次執(zhí)行該 SQL 時直接使用,可以避免反復執(zhí)行,從而優(yōu)化執(zhí)行過程,這種策略被稱為“Optimize Once”,即“一次優(yōu)化”。
計劃緩存是一個典型的 Key-Value 結構,Key 就是參數(shù)化后的 SQL 字符串,Value 就是該條 SQL 所對應的執(zhí)行計劃。
每個租戶在每一臺服務器上都有一個獨立的計劃緩存,用以緩存在此服務器上處理過的 SQL 計劃。在 OceanBase 數(shù)據(jù)庫的計劃緩存中,SQL 的執(zhí)行計劃可以分為本地計劃、遠程計劃和分布式計劃三種類型。在計劃緩存中,同一條 SQL 根據(jù)其需要訪問的數(shù)據(jù)不同,可能同時具有三種執(zhí)行計劃。
對于一條 SQL 的一種執(zhí)行計劃,OceanBase 數(shù)據(jù)庫默認只會保留第一次執(zhí)行 SQL 時生成的計劃;但在某些情況下,同一條 SQL 的參數(shù)值可能會影響到執(zhí)行計劃的選擇,所以計劃緩存會根據(jù)需要,為不同的參數(shù)值保留不同的執(zhí)行計劃,從而保證每次執(zhí)行時可以使用最合適的計劃。
計劃緩存的淘汰是指將執(zhí)行計劃從計劃緩存中刪除,減少計劃緩存對內(nèi)存的使用。OceanBase 數(shù)據(jù)庫支持自動淘汰和手動淘汰兩種方式。
自動淘汰是指當計劃緩存占用的內(nèi)存達到了需要淘汰計劃的內(nèi)存上限(即淘汰計劃的高水位線)時,對計劃緩存中的計劃執(zhí)行自動淘汰。
plan_cache_evict_interval
? 設置)系統(tǒng)會自動檢查不同租戶在不同服務器上的計劃緩存,并判斷是否需要執(zhí)行計劃淘汰。如果某個計劃緩存占用的內(nèi)存超過該租戶設置的淘汰計劃的高水位線,則會觸發(fā)計劃緩存淘汰。
plan_cache_evict_interval
?ob_plan_cache_percentage
?ob_plan_cache_percentage
?/100
ob_plan_cache_evict_high_percentage
?/100
ob_plan_cache_evict_low_percentage
?ob_plan_cache_evict_low_percentage
?/100例如,租戶內(nèi)存大小為 10 G,各參數(shù)值設置如下:
ob_plan_cache_percentage
?=10ob_plan_cache_evict_high_percentage
?=90ob_plan_cache_evict_low_percentage
?=50則計算得出:
由計算結果可知,當該租戶在某個服務器上計劃緩存使用超過 0.9 G 時,會觸發(fā)淘汰,優(yōu)先淘汰最久沒執(zhí)行的計劃,當淘汰到使用內(nèi)存只有 0.5 G 時,則停止淘汰。 如果淘汰速度沒有新計劃生成速度快,計劃緩存使用內(nèi)存達到內(nèi)存上限絕對值 1 G 時,將不在往計劃緩存中添加新計劃,直到執(zhí)行淘汰后所占內(nèi)存小于 1 G 才會添加新計劃到計劃緩存中。
手動淘汰是指強制將計劃緩存中計劃進行刪除?,F(xiàn)在支持指定不同租戶對應的當前服務器或全部服務器中計劃緩存全部刪除,具體命令如下:
obclient>ALTER SYSTEM FLUSH PLAN CACHE [tenant_list] [global]
/*其中 tenant_list 的格式為 tenant = 'tenant1, tenant2, tenant3….'*/
其中 tenant_list 和 global 為可選字段,使用說明如下:
計劃緩存中執(zhí)行計劃可能因為各種原因而失效,這時需要將計劃緩存中失效計劃進行刷新,即將該執(zhí)行計劃刪除后重新優(yōu)化生成計劃再加入計劃緩存。
如下場景會導致執(zhí)行計劃失效,需要對執(zhí)行計劃進行刷新:
計劃緩存可以使用系統(tǒng)變量及 HINT 實現(xiàn)使用控制。
ob_enable_plan_cache
? 設置為 TURE 時,表示 SQL 請求可以使用計劃緩存;設置為 FALSE 時,表示 SQL 請求不使用計劃緩存。默認為 TURE。此系統(tǒng)變量可被設置為 SESSION 級別或者 GLOBAL 級別。
/+USE_PLAN_CACHE(NONE)/
? 表示不使用計劃緩存。/+USE_PLAN_CACHE(DEFAULT)/
? 表示使用計劃緩存。執(zhí)行計劃相關視圖包括:
(g)v$plan_cache_stat
?記錄每個計劃緩存的狀態(tài),每個計劃緩存在該視圖中有一條記錄。(g)v$plan_cache_plan_stat
?記錄計劃緩存中所有執(zhí)行計劃的具體信息及每個計劃總的執(zhí)行統(tǒng)計信息。(g)v$plan_cache_plan_explain
?記錄某條 SQL 在計劃緩存中的執(zhí)行計劃。有關視圖的詳細參數(shù)信息,請參考 計劃緩存相關視圖。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: