<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                [TOC] # 執行計劃緩存 執行計劃緩存(Plan Cache)用于減少執行計劃的生成次數。 OceanBase 數據庫會緩存之前生成的執行計劃,以便在下次執行該 SQL 時直接使用,可以避免反復執行,從而優化執行過程,這種策略被稱為“Optimize Once”,即“一次優化”。 計劃緩存是一個典型的 Key-Value 結構,Key 就是參數化后的 SQL 字符串,Value 就是該條 SQL 所對應的執行計劃。 每個租戶在每一臺服務器上都有一個獨立的計劃緩存,用以緩存在此服務器上處理過的 SQL 計劃。在 OceanBase 數據庫的計劃緩存中,SQL 的執行計劃可以分為本地計劃、遠程計劃和分布式計劃三種類型。在計劃緩存中,同一條 SQL 根據其需要訪問的數據不同,可能同時具有三種執行計劃。 對于一條 SQL 的一種執行計劃,OceanBase 數據庫默認只會保留第一次執行 SQL 時生成的計劃;但在某些情況下,同一條 SQL 的參數值可能會影響到執行計劃的選擇,所以計劃緩存會根據需要,為不同的參數值保留不同的執行計劃,從而保證每次執行時可以使用最合適的計劃。 ## 計劃緩存的淘汰 計劃緩存的淘汰是指將執行計劃從計劃緩存中刪除,減少計劃緩存對內存的使用。OceanBase 數據庫支持自動淘汰和手動淘汰兩種方式。 #### **自動淘汰** 自動淘汰是指當計劃緩存占用的內存達到了需要淘汰計劃的內存上限(即淘汰計劃的高水位線)時,對計劃緩存中的計劃執行自動淘汰。 * 觸發執行計劃淘汰的條件 每隔一段時間(具體時間間隔由配置項`plan_cache_evict_interval`設置)系統會自動檢查不同租戶在不同服務器上的計劃緩存,并判斷是否需要執行計劃淘汰。如果某個計劃緩存占用的內存超過該租戶設置的淘汰計劃的高水位線,則會觸發計劃緩存淘汰。 * 執行計劃淘汰策略 當觸發計劃緩存淘汰后,優先淘汰最久沒被使用的執行計劃,淘汰一部分執行計劃后,當計劃緩存使用的內存為該租戶設置的淘汰計劃的低水位線時,停止淘汰。 * 與計劃緩存淘汰相關配置 * `plan_cache_evict_interval` 該配置項用于設置檢查執行計劃是否需要淘汰的間隔時間。 * `ob_plan_cache_percentage` 該系統變量用于設置計劃緩存可使用內存占租戶內存的百分比。公式如下: 計劃緩存最多可使用內存(內存上限絕對值)=租戶內存上限 \*`ob_plan_cache_percentage`/100 * `ob_plan_cache_evict_high_percentage` 該系統變量用于設置觸發計劃緩存淘汰的內存大小占內存上限絕對值的百分比。公式如下: 觸發計劃緩存淘汰的內存大小(淘汰計劃的高水位線) = 內存上限絕對值 \*`ob_plan_cache_evict_high_percentage`/100 * `ob_plan_cache_evict_low_percentage` 該系統變量用于設置停止淘汰計劃時的內存值(淘汰計劃的低水位線) 。公式如下: 停止淘汰計劃時的內存值(淘汰計劃的低水位線)= 內存上限絕對值 \*`ob_plan_cache_evict_low_percentage`/100 例如,租戶內存大小為 10 G,各參數值設置如下: * `ob_plan_cache_percentage`=10 * `ob_plan_cache_evict_high_percentage`=90 * `ob_plan_cache_evict_low_percentage`=50 則計算得出: * 計劃緩存內存上限絕對值 = 10G \* 10 / 100 = 1 G * 淘汰計劃的高水位線 = 1G \* 90 / 100 = 0.9 G * 淘汰計劃的低水位線 = 1G \* 50 / 100 = 0.5 G 由計算結果可知,當該租戶在某個服務器上計劃緩存使用超過 0.9 G 時,會觸發淘汰,優先淘汰最久沒執行的計劃,當淘汰到使用內存只有 0.5 G 時,則停止淘汰。 如果淘汰速度沒有新計劃生成速度快,計劃緩存使用內存達到內存上限絕對值 1 G 時,將不在往計劃緩存中添加新計劃,直到執行淘汰后所占內存小于 1 G 才會添加新計劃到計劃緩存中。 #### **手動淘汰** 手動淘汰是指強制將計劃緩存中計劃進行刪除。現在支持指定不同租戶對應的當前服務器或全部服務器中計劃緩存全部刪除,具體命令如下: ~~~ obclient>ALTER SYSTEM FLUSH PLAN CACHE [tenant_list] [global] /*其中 tenant_list 的格式為 tenant = 'tenant1, tenant2, tenant3….'*/ ~~~ 其中 tenant\_list 和 global 為可選字段,使用說明如下: * 如果沒有指定 tenant\_list,則清空所有租戶的計劃緩存。反之,則只清空特定租戶的計劃緩存。 * 如果沒有指定 global,則清空本機的計劃緩存。反之,則清空該租戶所在的所有服務器上的計劃緩存。 ## 計劃緩存的刷新 計劃緩存中執行計劃可能因為各種原因而失效,這時需要將計劃緩存中失效計劃進行刷新,即將該執行計劃刪除后重新優化生成計劃再加入計劃緩存。 如下場景會導致執行計劃失效,需要對執行計劃進行刷新: * SQL 中涉及表的 Schema 變更時(比如添加索引、刪除或增加列等),該 SQL 在計劃緩存中所對應的執行計劃將被刷新。 * SQL 中涉及重新收集表的統計信息時,該 SQL 在計劃緩存中所對應的執行計劃會被刷新。由于 OceanBase 數據庫在數據合并時會統一進行統計信息的收集,因此在每次進行合并后,計劃緩存中所有計劃將被刷新。 ## 計劃緩存的使用控制 計劃緩存可以使用系統變量及 HINT 實現使用控制。 * 系統變量控制 當`ob_enable_plan_cache`設置為 TURE 時,表示 SQL 請求可以使用計劃緩存;設置為 FALSE 時,表示 SQL 請求不使用計劃緩存。默認為 TURE。此系統變量可被設置為 SESSION 級別或者 GLOBAL 級別。 * HINT 控制 * 使用 HINT 語句`/+USE_PLAN_CACHE(NONE)/`表示不使用計劃緩存。 * 使用 HINT 語句`/+USE_PLAN_CACHE(DEFAULT)/`表示使用計劃緩存。 ## 計劃緩存暫不支持的場景 * 執行計劃所占內存超過 20 M 時,不會加入計劃緩存。 * 如果該計劃為分布式執行計劃且涉及多個表,不會加入計劃緩存。 ## 計劃緩存的視圖 執行計劃相關視圖包括: * `(g)v$plan_cache_stat` 記錄每個計劃緩存的狀態,每個計劃緩存在該視圖中有一條記錄。 * `(g)v$plan_cache_plan_stat` 記錄計劃緩存中所有執行計劃的具體信息及每個計劃總的執行統計信息。 * `(g)v$plan_cache_plan_explain` 記錄某條 SQL 在計劃緩存中的執行計劃。 有關視圖的詳細參數信息,請參考[計劃緩存相關視圖](https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.0/plan-cache-view)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看