主頁 > 資料庫 > 執行計劃快取,Prepared Statement性能躍升的秘密

執行計劃快取,Prepared Statement性能躍升的秘密

2023-06-03 08:46:23 資料庫

摘要:一起看一下GaussDB(for MySQL)是如何對執行計劃進行快取并加速Prepared Statement性能的,

本文分享自華為云社區《執行計劃快取,Prepared Statement性能躍升的秘密》,作者: GaussDB 資料庫,

引言

在資料庫系統中,SQL(Structured Query Language)陳述句輸入到系統后,一般要經歷:詞法語法決議(parse)、重寫(resolve)、優化(optimize)、執行(execute)的程序,詞法語法分析,重寫和優化,這三個階段會生成SQL陳述句的執行計劃 (plan),當SQL陳述句存在多種執行計劃的時候,優化器會從這許多的執行計劃中挑選出一個它認為最優的(通常是占用系統資源最少的,包括CPU以及IO等)作為最終的執行計劃供執行器執行,生成執行計劃的程序會消耗較多的時間,特別是存在許多可選的執行計劃時,

圖1:SQL陳述句執行

Prepared Statement是將SQL陳述句中的值用占位符替代,可以視為將SQL陳述句模板化或者說引數化,當執行PREPARE陳述句時,傳統MySQL將對指定的陳述句進行詞法語法決議和重寫,如上圖①②,該階段稱為預編譯階段,Prepared Statement的優勢在于一次編譯、多次運行,省去了預編譯階段需要的時間,隨后發出EXECUTE命令時,MySQL將對編譯階段生成的結構執行優化,即上圖的③,生成對應的執行計劃并執行,把輸出結果回傳到客戶端,例如:

PREPARE stmt FROM ‘SELECT * FROM t WHERE t.a = ?’;
SET @var = 2;
EXECUTE stmt USING @var;

傳統MySQL的Prepared Statement只會節省SQL陳述句的決議及重寫程序需要的時間,但是對于一條SQL陳述句,如文章開頭所述,優化SQL陳述句并生成執行計劃需要耗費大量的資源以及時間,如果能將該Prepared Statement陳述句對應的最終執行計劃進行快取,當執行EXECUTE陳述句的時候,就可以直接使用已快取的執行計劃,從而就可以跳過SQL陳述句生成執行計劃的整個程序,進而可以提高陳述句的執行性能,為此,GaussDB(for MySQL) 提供了Prepared Statement執行計劃快取特性,

接下來一起看一下GaussDB(for MySQL)是如何對執行計劃進行快取并加速Prepared Statement性能的,

執行計劃快取作業原理

GaussDB(for MySQL)對Prepared Statement執行計劃進行快取的基本原理和流程如下圖所示:

  • 回應EXECUTE,執行查詢,
  • 通過is_plan_cached程序來查看當前Query的執行計劃是否已經被快取,
  • 如果已經被快取,優化器將對當前的Query快取的執行計劃進行初始化,根據執行計劃的背景關系還原執行計劃,然后利用還原的執行計劃繼續執行,
  • 如果沒有被快取,在執行完Query優化生成執行計劃之后,通過is_query_cachable程序驗證當前執行計劃是否可以被快取,
  • 如果滿足快取條件,執行計劃將會被快取(呼叫cache_JOIN_plan),以便以后的EXECUTE陳述句可以利用該快取的計劃進行執行,
  • 如果不能快取,通過傳統的MySQL執行流程(優化,生成執行計劃然后執行)執行EXECUTE陳述句,

執行計劃快取管理

  • 執行計劃快取功能開關

GaussDB(for MySQL)引入了一個新的系統引數rds_plan_cache來開關Prepared Statement執行計劃快取功能,

rds_plan_cache:該引數可以設定為ON/OFF,分別代表開啟和關閉執行計劃快取,該引數是Session/Global級別的引數,

  • 查看執行計劃快取情況

GaussDB(for MySQL)提供了兩個狀態變數供用戶查看或者驗證Prepared Statement執行計劃是否被快取,以及在執行時是否命中了快取的執行計劃,

  • cached_plan_count:顯示有多少個Prepared Statement快取了執行計劃,這是一個Global級別的狀態變數,
  • cached_plan_hits:顯示EXECUTE執行程序中命中了快取的執行計劃的次數,這是一個Session/Global狀態,

下面舉例來看一下Prepared Statement是如何利用了執行計劃快取特性的:

SET @a = 'two';
SET @b = 3;
PREPARE stmt FROM "SELECT * FROM t1 WHERE b = ? AND c = ?";
EXECUTE stmt USING @a,@b;

執行結果如下:

a b c
6 two 3

再次執行Prepared Statement:

EXECUTE stmt USING @a,@b;
a b c
6 two 3

第三次執行Prepared Statement:

execute stmt using @a,@b;
a b c
6 two 3

通過cached_plan_count和cached_plan_hits查看stmt執行計劃是否被快取,以及在執行時是否命中了快取的執行計劃,

SHOW SESSION STATUS LIKE "cached_plan%";

顯示結果如下:

Variable_name Value
Cached_plan_count 1
Cached_plan_hits 2

從顯示結果可以看出,第一次執行EXECUTE陳述句的時候,Prepared Statement對執行計劃進行了快取,即可以看到Cached_plan_count為1; 之后執行兩次EXECUTE陳述句,都命中了執行計劃快取,所以可以看到Cached_plan_hits變成了2,

快取的執行計劃如何失效

為了保持當前快取的執行計劃是盡可能最優的,GaussDB(for MySQL)定義了如下規則來對當前快取的計劃進行失效,并重新生成執行計劃:

  • 執行計劃相關表的記錄數更改超過總記錄數的20%,
    這意味著當前表的記錄數如果插入/洗掉超過20%的記錄,當前快取計劃將失效并在優化后重新快取,注:記錄數是根據統計資料估計的,所以最好先對表進行Analyze,
  • 表定義進行了更改,
    例如,執行計劃相關表上進行的DDL將導致快取計劃無效,并在優化后重新快取,
  • 如果系統變數Optimizer_switch中影響執行計劃生成的選項值進行了更改,則快取的計劃將失效,并在優化后重新快取,
  • 系統字符集發生變化,與快取的計劃不同時,將導致快取計劃失效,并在優化后重新快取,

執行計劃快取功能當前的一些限制

GaussDB(for MySQL)的Prepared Statement的目的是節約查詢的優化時間,對于通過并行查詢優化的大查詢,也就是資料量相對龐大的查詢,這些查詢大部分的執行時間是集中在執行計劃的執行階段,對于該型別的查詢,優化時間相比執行時間而言可以忽略不計,所以GaussDB(for MySQL)沒有對并行查詢計劃進行快取,另外,GaussDB(for MySQL)對于Prepared statement 快取執行計劃的能力還在逐步增強中,比如當前只支持單表的SELECT查詢陳述句,暫時還不支持UNION操作,

執行計劃快取性能測驗結果

對于使用執行計劃快取和不使用執行計劃快取的場景,基于Sysbench測驗集進行了性能測驗對比,從測驗結果可以看出,在啟用執行計劃快取后,各類業務性能均有提升,注意:這些測驗只代表相對數字,并不代表實際性能,

測驗環境配置如下:

資料集 : 8 個表,每個表1000萬行
測驗服務器:Intel(R) Xeon(R) CPU E5-2690 v4 @ 2.60GHz 2 physical cores 56 processors 460G memory

總結

GaussDB(for MySQL)通過快取執行計劃,可以提升Prepared Statement的性能,特別是針對Range Scan的測驗集,性能提升可達2倍左右,未來我們會支持越來越多的查詢場景,性能加速值得期待,

 

點擊關注,第一時間了解華為云新鮮技術~

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/554204.html

標籤:其他

上一篇:2個場景實體講解GaussDB(DWS)基表統計資訊估算不準的處理方案

下一篇:返回列表

標籤雲
其他(160269) Python(38199) JavaScript(25474) Java(18184) C(15236) 區塊鏈(8269) C#(7972) AI(7469) 爪哇(7425) MySQL(7226) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5346) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4581) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1980) 功能(1967) HtmlCss(1952) Web開發(1951) C++(1928) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1879) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 執行計劃快取,Prepared Statement性能躍升的秘密

    摘要:一起看一下GaussDB(for MySQL)是如何對執行計劃進行快取并加速Prepared Statement性能的。 本文分享自華為云社區《執行計劃快取,Prepared Statement性能躍升的秘密》,作者: GaussDB 資料庫。 引言 在資料庫系統中,SQL(Structure ......

    uj5u.com 2023-06-03 08:46:23 more
  • 2個場景實體講解GaussDB(DWS)基表統計資訊估算不準的處理方案

    摘要:通過2個實體場景講解GaussDB(DWS)運維解決方案。 本文分享自華為云社區《GaussDB(DWS)運維 -- 基表統計資訊估算不準的常見場景及處理方案》,作者:譡里個檔。 場景1:基表過濾欄位存在的隱式型別時,基表行數估算偏小 這種場景絕大部分場景DWS能夠處理,但是如果隱式型別轉后的 ......

    uj5u.com 2023-06-03 08:46:17 more
  • 4萬6千多高中作文大全ACCESS資料庫

    作文類的資料庫雖然已經有很多,有近萬條的,也有2萬條的,但今天弄到了小學、中學、高中一個系列的資料,而且最主要的是資料的記錄數很多。這份高中作文包含46169條記錄,分類也很好。 grade欄位統計:高一(14062)、高二(13375)、高三(17381)、高考(1351)。 type欄位統計:散 ......

    uj5u.com 2023-06-03 08:46:09 more
  • 2個場景實體講解GaussDB(DWS)基表統計資訊估算不準的處理方案

    摘要:通過2個實體場景講解GaussDB(DWS)運維解決方案。 本文分享自華為云社區《GaussDB(DWS)運維 -- 基表統計資訊估算不準的常見場景及處理方案》,作者:譡里個檔。 場景1:基表過濾欄位存在的隱式型別時,基表行數估算偏小 這種場景絕大部分場景DWS能夠處理,但是如果隱式型別轉后的 ......

    uj5u.com 2023-06-03 08:45:50 more
  • 讀改變未來的九大演算法筆記02_資料庫

    ![](https://img2023.cnblogs.com/blog/3076680/202306/3076680-20230602231102469-1389179464.png) # 1. 基礎思想 ## 1.1. 預寫日志記錄 ## 1.2. 兩階段提交 ## 1.3. 關系資料庫 # 2 ......

    uj5u.com 2023-06-03 08:45:34 more
  • Redis(一) -- 基礎

    # Redis Redis是一個開源(BSD許可高性能的記憶體存盤的key-value資料庫! 可用作資料庫,高速快取和訊息佇列代理。它支持字串、哈希表、串列(List)、集合(Set)、有序集合(Ordered Sets),位圖(bitmap),hyperloglogs,GEO等資料型別。內置復制 ......

    uj5u.com 2023-06-03 08:45:27 more
  • SQLite教程1

    ## 0簡介 在這個SQLite初學者教程中,我們用詳細的例子涵蓋了所有關于SQLite的基礎到高級主題。本課程將通過簡單易懂的主題和例子幫助你學習SQLite。 ### 什么是SQLite? SQLite是一個開源的、嵌入式的、關系型的資料庫管理系統,大約設計于2000年。它是一個輕量級的資料庫, ......

    uj5u.com 2023-06-03 08:45:13 more
  • 03_事務隔離

    # 03_事務隔離 ### 事務隔離 事務需要保證一組資料庫操作,要么全部成功,要么全部失敗; MySQL事務隔離性是保證資料一致性和并發控制的重要手段之一,它對于多個事務同時訪問和修改同一資料的情況下,能夠保證事務之間的獨立性和隔離性,避免資料的不一致和沖突。 ACID是MySQL事務的四個特性, ......

    uj5u.com 2023-06-03 08:44:30 more
  • 02_重要的兩個日志 redo log 和 binlog

    # 02_重要的兩個日志 redo log 和 binlog MySQL 45 講Note: 課程專欄名稱:《MySQL實戰45講》課程 筆記參考:[MYSQL45 講](https://gitee.com/moxi159753/LearningNotes/tree/master/MySQL/MyS ......

    uj5u.com 2023-06-03 08:44:22 more
  • 執行計劃快取,Prepared Statement性能躍升的秘密

    摘要:一起看一下GaussDB(for MySQL)是如何對執行計劃進行快取并加速Prepared Statement性能的。 本文分享自華為云社區《執行計劃快取,Prepared Statement性能躍升的秘密》,作者: GaussDB 資料庫。 引言 在資料庫系統中,SQL(Structure ......

    uj5u.com 2023-06-03 08:44:05 more