目錄
自動化參數執行計劃緩存簡介??? ?
SQL參數化及約束條件
一般常量參數化示例??? ?
總結
自動化參數執行計劃緩存簡介??? ?
執行計劃緩存用于減少執行計劃的生成次數。openGauss數據庫會緩存之前生成的執行計劃,以便在下次執行該SQL時直接使用,可以避免反復執行,從而優化執行過程。
參數化過程是指把SQL查詢中的常量變成變量的過程。同一條SQL語句在每次執行時可能會使用不同的參數,將這些參數做參數化處理,可以得到與具體參數無關的SQL字符串,并使用該字符串作為計劃緩存的鍵值,用于在計劃緩存中獲取執行計劃,從而達到參數不同的SQL能夠共用相同計劃的目標。
openGauss數據庫的自動化參數方案是在語法分析樹的基礎上進行參數化,然后使用參數化后的語法分析樹作為鍵值計劃緩存中獲取計劃。
openGauss數據庫基于自動參數化而獲取執行計劃的流程如下圖所示:
SQL參數化及約束條件
在openGauss?數據庫中,?某些場景中SQL不能參數化,及約束條件如下:
-
僅支持IUD(insert, Update, Delete)三類DML
-
僅支持Simple Query Protocal,?不支持Extended Query Protocol
1. Simple Query Protacol:?例:gsql client
2. Extended Quey Protocal:?例:JDBC client中的PreparedStatement
-
不支持含returning關鍵詞,不支持with clause,不支持hint,不支持子查詢,不支持order by,不支持limit,?不支持函數,不支持含collate關鍵詞,不支持type cast,不支持使用NULL關鍵詞,不支持lgnore。
一般常量參數化示例??? ?
openGauss使用自動化參數執行計劃緩存需要開啟自動化參數
SQL
set?enable_query_parameterization=on;
執行如下簡單DML語句,自動化參數可以將?delete from table_btree where id = 250192?參數化為?delete from table_btree where id = $1,后續執行SQL便可以以自動化參數后的字符串為鍵值從緩存中取到執行計劃。???????
sql
delete?from?table_btree?where?id?=?250192;
delete?from?table_btree?where?id?=?484195;
delete?from?table_btree?where?id?=?595524;
delete?from?table_btree?where?id?=?982023;
總結
openGauss的自動化參數執行計劃緩存特性目前支持simple query場景下的簡單DML語句,使得非參數化語句能夠?重復利用執行計劃,減少執行計劃的生成代價。對基礎算子場景的性能提升具有很大幫助。