GaussDB 數據庫架構師修煉(十八) SQL引擎-計劃管理-SPM

1 背景

由于業務數據的變化或者數據庫版本的升級,可能導致SQL的執行計劃發生變化,這種變化不一定正收益,這時需?要一個防止計劃劣化的機制。該機制需適用于版本升級時固化計劃防止計劃跳變等場景。

2? SPM?的功能

SPM(SQL Plan?Manager)

功能:固化計劃防止計劃跳變,影響業務性能。

?計劃捕獲:SPM能將一個具體SQL的執行計劃落盤,稱之為Plan?baseline(計劃基線)?

?計劃選擇:SPM會判斷是否將優化器給出的執行計劃交給執行器執行,選擇優化器給出的執行計劃,還是SPM存儲的計劃。

?計劃演進:SPM能將優化器新產生的計劃進行判斷,如果斷優秀會標記(ACC&UNACC)以備計劃選擇使用。

3 SPM示例

步驟1:數據準備

csdn=> DROP TABLE IF EXISTS tb_a;
DROP TABLE
csdn=> CREATE TABLE tb_a (id int, c1 int, c2 int, pad text);
CREATE TABLE
csdn=> CREATE INDEX tb_a_idx_c1 ON tb_a (c1);
CREATE INDEX
csdn=> INSERT INTO tb_a select  id,  (random()*200)::int,(random()*10000)::int, 'ss'  FROM  (SELECT generate_series(1,10000)  id) tb_a;
INSERT 0 10000
csdn=> ANALYZE tb_a;
ANALYZE
csdn=>

步驟2:參數設置


csdn=> SET spm_enable_plan_capture=manual;   -- 開啟SPM計劃選擇
SET
csdn=> SET spm_enable_plan_selection=on;   -- 當前SPM只支持gplan,確保生成的計劃是gplan
SET
csdn=> SET plan_cache_mode = 'force_generic_plan'; -- 在pretty模式可以看到baseline的使用情況
SET
csdn=>
csdn=> SET explain_perf_mode=pretty;  --設置Oracle查看計劃顯示格風
SET
csdn=>

步驟3:計劃捕獲

-- 捕獲tablescan,確保捕獲tablescan計劃
csdn=> SET enable_seqscan=on;   
SET
csdn=>
csdn=> SET enable_indexscan=off;
SET
csdn=> SET enable_bitmapscan=off;
SET
csdn=>
-- 執行測試sql
csdn=> PREPARE spm_query AS SELECT * FROM tb_a WHERE c1 = $1;
PREPARE
csdn=> EXPLAIN(costs off) EXECUTE spm_query (1);id |      operation
----+----------------------1 | ->  Seq Scan on tb_a
(1 row)Predicate Information (identified by plan id)
-----------------------------------------------1 --Seq Scan on tb_aFilter: (c1 = $1)
(2 rows)csdn=>csdn=> SELECT sql_hash, plan_hash, outline, status, gplan FROM gs_spm_sql_baseline WHERE sql_text  LIKE '%tb_a WHERE c1 = $1%';sql_hash  | plan_hash |                outline                 | status | gplan
------------+-----------+----------------------------------------+--------+-------1850279601 | 154472964 |  begin_outline_data                   +| ACC    | t|           |  TableScan(@"sel$1" csdn.tb_a@"sel$1")+|        ||           |  version("1.0.0")                     +|        ||           |  end_outline_data                      |        |
(1 row)csdn=>

步驟4:計劃選擇

csdn=> SET enable_bitmapscan=on;  -- 確保優化器生成的計劃是bitmapscan
SET
csdn=> SET enable_seqscan=off;
SET
csdn=>  SET enable_indexscan=off;
SET
-- 執行SQL
csdn=> DEALLOCATE spm_query;
DEALLOCATE
csdn=> PREPARE spm_query AS SELECT *  FROM tb_a WHERE c1 = $1;
PREPARE
csdn=> SET plan_cache_mode = 'force_generic_plan';   --強制走軟解析
SET
csdn=> show plan_cache_mode;plan_cache_mode
--------------------force_generic_plan
(1 row)csdn=> EXPLAIN(costs off) EXECUTE spm_query (1);id |                 operation
----+--------------------------------------------1 | ->  Bitmap Heap Scan on tb_a2 |    ->  Bitmap Index Scan using tb_a_idx_c1
(2 rows)Predicate Information (identified by plan id)
-----------------------------------------------1 --Bitmap Heap Scan on tb_aRecheck Cond: (c1 = $1)2 --Bitmap Index Scan using tb_a_idx_c1Index Cond: (c1 = $1)
(4 rows)====== Query Others =====
----------------------------------------------------------------use_baseline: Yes, sql_hash: 3237163112, plan_hash: 2994191517--查看現有計劃
csdn=>  SELECT sql_hash, plan_hash, outline, status, gplan, cost
csdn->  FROM gs_spm_sql_baseline
csdn->  WHERE sql_text like '%tb_a WHERE c1 = $1%'
csdn->  ORDER  BY creation_time;sql_hash  | plan_hash  |                       outline                       | status | gplan |  cost
------------+------------+-----------------------------------------------------+--------+-------+--------1850279601 |  154472964 |  begin_outline_data                                +| ACC    | t     |    166|            |  TableScan(@"sel$1" csdn.tb_a@"sel$1")             +|        |       ||            |  version("1.0.0")                                  +|        |       ||            |  end_outline_data                                   |        |       |3237163112 | 2994191517 |  begin_outline_data                                +| ACC    | t     | 48.451|            |  BitmapScan(@"sel$1" csdn.tb_a@"sel$1" tb_a_idx_c1)+|        |       ||            |  version("1.0.0")                                  +|        |       ||            |  end_outline_data                                   |        |       |
(2 rows)csdn=>

注:從查看現有的計劃,cost成本為48.451是正能量,對應的sql_hash、plan_hash分別為:

3237163112、?2994191517

步驟5:計劃演進

我理解為將最優的計劃打上ACC標簽,不優的計劃打上UNACC即可。

-- 使用spm 計劃演進
csdn=>  SELECT * FROM dbe_sql_util.gs_spm_evolute_plan(3237163112,2994191517);evolute_status
----------------t
(1 row)csdn=>  SELECT sql_hash, plan_hash, better,  refer_plan, reason  FROM gs_spm_sql_evolution WHERE sql_hash=3237163112;sql_hash  | plan_hash  | better | refer_plan |                          reason
------------+------------+--------+------------+-----------------------------------------------------------3237163112 | 2994191517 | f      |          0 | execution time is more than 10% greater than the baseline-- 根據演進結論修改seqscan計劃狀態為UNACC
csdn=> SELECT * FROM dbe_sql_util.gs_spm_set_plan_status (1850279601,154472964,'UNACC');gs_spm_set_plan_status
------------------------t
(1 row)csdn=>
--查看UNACC
csdn=>  SELECT sql_hash, plan_hash, outline, status, gplan, costFROM gs_spm_sql_baselineWHERE sql_text like '%tb_a WHERE c1 = $1%'ORDER  BY creation_time;sql_hash  | plan_hash  |                       outline                       | status | gplan |  cost
------------+------------+-----------------------------------------------------+--------+-------+--------1850279601 |  154472964 |  begin_outline_data                                +| UNACC  | t     |    166|            |  TableScan(@"sel$1" csdn.tb_a@"sel$1")             +|        |       ||            |  version("1.0.0")                                  +|        |       ||            |  end_outline_data                                   |        |       |3237163112 | 2994191517 |  begin_outline_data                                +| ACC    | t     | 48.451|            |  BitmapScan(@"sel$1" csdn.tb_a@"sel$1" tb_a_idx_c1)+|        |       ||            |  version("1.0.0")                                  +|        |       ||            |  end_outline_data                                   |        |       |
(2 rows)csdn=>

步驟6:計劃演證

csdn=> SET enable_seqscan=on;
SET
csdn=> SET enable_indexscan=on;
SET
csdn=> SET plan_cache_mode = 'force_generic_plan';
SET
csdn=> SET explain_perf_mode=pretty;
SET
csdn=> DEALLOCATE spm_query;
DEALLOCATE
csdn=> PREPARE spm_query AS SELECT * FROM tb_a WHERE c1 = $1;
PREPARE
csdn=> EXPLAIN(costs off) EXECUTE spm_query (1);id |                 operation
----+--------------------------------------------1 | ->  Bitmap Heap Scan on tb_a2 |    ->  Bitmap Index Scan using tb_a_idx_c1
(2 rows)Predicate Information (identified by plan id)
-----------------------------------------------1 --Bitmap Heap Scan on tb_aRecheck Cond: (c1 = $1)2 --Bitmap Index Scan using tb_a_idx_c1Index Cond: (c1 = $1)
(4 rows)

4 批注

SPM主要是為要防止因為業務數據變化或版本升級引起的SQL計劃跳變而影響業務性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920573.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920573.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920573.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數字IC前端設計——前仿篇(VCS,DVE,Verdi)

文章目錄引言一、軟件介紹1. VCS2. DVE3. Verdi二、VCS的使用1. VCS的編譯流程2. 常用的編譯選項1)基礎編譯選項2)調試相關選項3)性能優化選項4)文件和路徑選項3. 常用仿真選項1)基礎仿真選項2)運行控制選項…

20250826--inter

一、非對稱加密的應用 非對稱加密應用-CSDN博客 2、怎么避免跨站腳本攻擊,包括還有其他的一些web安全,怎么做的 網頁安全XSS攻擊和CSRF攻擊_csrf共計-CSDN博客 3、前端異常監控,性能監控,埋點,怎么做的 &#xff1f…

MongoDB Shell

MongoDB官方提供的單獨命令行工具 MongoDB Shell Download | MongoDB 下載MongoDB Shell windows系統打開,直接在解壓后的目錄里面找到bin目錄 然后雙擊打開mongosh.exe這個文件 看到這個命令行就表示Mongo Shell已經啟動成功了 test代表 當前正在使用的數據庫的…

Docker03-知識點整理

Docker03-知識點整理 文章目錄Docker03-知識點整理1-參考網址2-知識整理2-思考題1-Docker image和Docker Native image有什么區別1. Docker Image(Docker 鏡像)定義特點構建和使用示例2. Docker Native Image(通常指 GraalVM Native Image 結…

華為 eNSP 從入門到精通:企業級網絡仿真全攻略

一、eNSP 簡介華為 eNSP(Enterprise Network Simulation Platform )是面向企業網絡的虛擬化仿真平臺,其核心架構基于分布式虛擬化引擎和真實設備鏡像,具備以下技術亮點:高度仿真:可模擬華為 AR 路由器、x7 …

docker compose設置命令別名的方法

docker compose名字比較長,輸入比較費事,可以為它設置別名來簡化輸入。1、Linux編輯~/.bash_aliasesalias dcdocker-compse編輯~/.bashrc,確認其包含以下內容:if [ -f ~/.bash_aliases ]; then. ~/.bash_aliasesfi重新加載 ~/.bas…

【RAGFlow代碼詳解-10】文本處理和查詢處理

概述 文本處理和查詢處理系統將自然語言查詢轉換為與 RAGFlow 的文檔存儲后端配合使用的優化搜索表達式。該系統支持中英文文本處理,具有專門的標記化、術語加權和查詢增強技術。核心組件 FulltextQueryer 類 FulltextQueryer 類是查詢處理和文本分析的主要接口。它…

利用機器學習優化Backtrader策略原理與實踐

1. Backtrader框架概述 1.1 Backtrader簡介 Backtrader是一個功能強大且靈活的Python庫,專為量化交易策略的開發、測試和執行而設計。它提供了豐富的功能,包括數據獲取、策略開發、回測、優化和繪圖等。Backtrader的核心優勢在于其模塊化設計和高度可擴展…

CPTS-Pressed復現(XML-RPC)

該box主要是了解wordpress-XML-RPC 的使用 端口掃描只有80端口開啟 可以使用wpscan進行掃描發現bak文件得到憑證,嘗試登陸(這里是將原密碼的2021修改為2022嘗試登陸,該主機發布時間為2022年)發現有2FA,但是能夠濫用 xm…

【機器學習深度學習】Embedding 與 RAG:讓 AI 更“聰明”的秘密

目錄 前言 一、RAG 的兩大階段 1. 知識庫構建階段 2. 查詢檢索與生成階段 二、為什么 RAG 比單純大模型更靠譜? 四、Embedding 在 RAG 中的作用 五、Embedding 的優勢 六、Embedding 的挑戰 七、RAG 優勢與挑戰對比 八、應用場景舉例 總結 前言 在大模型…

python 轉偶數

目錄 python變量轉偶數 box轉偶數 python變量轉偶數 x1 int(x1) // 2 * 2 y1 int(y1) // 2 * 2 x2 int(x2) // 2 * 2 y2 int(y2) // 2 * 2 box轉偶數 def save_mp4(output_path,box_list,img_list,clip_start,clip_end):writer imageio.get_writer(output_path,fps30,c…

Linux - 中文顯示亂碼問題解決方法(編碼查看及轉換)- 學習/實踐

1.應用場景 主要用于Linux中文顯示亂碼問題解決(編碼查看及轉換) 2.學習/操作 1.文檔閱讀 Linux中文顯示亂碼問題解決方法(編碼查看及轉換) - 整合俠 - 博客園 截圖: 2.整理輸出 TBD 后續補充 ... 3.問題/補充 TBD 后續補充 ...…

網絡_協議

關鍵詞: OSI是Open System Interconnect的縮寫,意為開放式系統互聯。 RTT : Round-Trip time 往返時間 RTO:Retransmission Timeout超時重傳時間 MSL : OSI 七層模型和 TCP/IP 四層模型 OSI七層模型和TCP/IP五層模型&#…

vscode有的結構體不能補全,有的可以補全問題的解決.

定義了一個結構體,發現不能自動補全變量名稱.而另外一個結構體卻可以正常補全.經過研究發現是,新定義的結構體變量類型uint32_t,vscode認為其是錯誤類型導致的.暫時改為int型,后發現問題消失.可以正常補全了.由于工程使用cubeide生成,uint32_t定義在軟件安裝目錄,并沒有和項目文…

JavaScript 數組核心操作實戰:最值獲取與排序實現(從基礎到優化)

在JavaScript開發中,數組的“最值獲取”和“排序”是高頻需求。本文將基于你的原始代碼,系統解析數組最值獲取、升序/降序排序的實現邏輯,通過“問題分析→代碼優化→原理講解”的流程,幫助你掌握更靈活、高效的數組操作方法&…

driver.js實現前端頁面引導

1.安裝 npm install driver.js2.實現代碼示例 <template><div class"home-container"><!-- 頁面內容 --><LeftPanel id"guide-left-panel" /><button id"guide-file-upload">文件上傳</button><button i…

技術速遞|使用 AI 應用模板擴展創建一個 .NET AI 應用與自定義數據進行對話

在本快速入門中&#xff0c;你將學習如何使用 .NET AI 應用模板創建一個 .NET AI 應用&#xff0c;與自定義數據進行對話。該模板旨在簡化 .NET 構建 AI 應用的上手體驗&#xff0c;幫助你處理常見的設置任務和配置。 先決條件 .NET 9.0 SDK 以下任一 IDE&#xff08;可選&am…

使用Cloudflare的AI Gateway代理Google AI Studio

1、說明詳見&#xff1a;詳見&#xff1a;https://developers.cloudflare.com/ai-gateway/usage/providers/google-ai-studio在"Google AI Studio"創建"API key" 在"Cloudflare"創建"AI Gateway"、獲取"Account ID"2、在“G…

Scrapy 框架實戰:構建高效的快看漫畫分布式爬蟲

一、Scrapy框架概述 Scrapy是一個為了爬取網站數據&#xff0c;提取結構性數據而編寫的應用框架&#xff0c;它提供了強大的數據提取能力、靈活的擴展機制以及高效的異步處理性能。其核心架構包括&#xff1a; Engine&#xff1a;控制所有組件之間的數據流&#xff0c;當某個…