Dynamic Join Filter
Dynamic Join Filter通過動態收集Hash Join的右表Join鍵信息,在Join計算前過濾左表中無法Join匹配的數據,從而提升AnalyticDB PostgreSQL版的Hash Join的性能。
注意事項
內核版本為V6.3.8.0及以上版本。如何升級內核版本,請參見版本升級。
僅支持Legacy優化器,不支持ORCA優化器。關于優化器的詳細信息,請參見查詢性能優化指導。
僅支持Laser計算引擎。關于Laser計算引擎的詳細信息,請參見Laser計算引擎的使用。
不支持執行計劃中包含IntiPlan的SQL。
支持UDP網絡模式,不支持TCP網絡模式。
功能介紹
Hash Join是AnalyticDB PostgreSQL版中常用的算子,95%以上的關聯查詢是通過Hash Join實現的,由于Hash Join涉及到磁盤讀寫、網絡交互和大量的計算,通常會成為查詢中的瓶頸。
AnalyticDB PostgreSQL版于V6.3.8.0版本支持Dynamic Join Filter功能,通過動態收集Hash Join的右表Join鍵信息,在Join計算前過濾左表中無法Join匹配的數據,減少不必要的磁盤讀取、網絡和CPU計算開銷,從而提升Hash Join的性能。Dynamic Join Filter原理示意圖如下:
關閉或開啟Dynamic Join Filter功能
Dynamic Join Filter功能默認為開啟狀態,您可以通過修改adbpg_enable_dynamic_join_filter參數關閉或開啟Dynamic Join Filter功能,操作方法如下:
會話級別關閉Dynamic Join Filter功能:
SET adbpg_enable_dynamic_join_filter TO off;
會話級別開啟Dynamic Join Filter功能:
SET adbpg_enable_dynamic_join_filter TO on;
上述方法僅支持會話級別關閉或開啟Dynamic Join Filter功能,如需實例級別關閉或開啟Dynamic Join Filter功能,請提交工單聯系技術支持進行修改。
使用示例
以下示例以TPC-H測試集中的lineitem和part表作為測試數據表,使用TPC-H中的Q17語句為例對比開啟或關閉Dynamic Join Filter功能后的查詢耗時。
本文的TPC-H的實現基于TPC-H的基準測試,并不能與已發布的TPC-H基準測試結果相比較,本文中的測試并不符合TPC-H基準測試的所有要求。
使用TPC-H在本地生成1 GB測試數據,操作方法,請參見生成測試數據。
創建用于測試的lineitem和part表,建表語句如下:
CREATE TABLE LINEITEM ( L_ORDERKEY BIGINT NOT NULL, L_PARTKEY INTEGER NOT NULL, L_SUPPKEY INTEGER NOT NULL, L_LINENUMBER INTEGER NOT NULL, L_QUANTITY NUMERIC(15,2) NOT NULL, L_EXTENDEDPRICE NUMERIC(15,2) NOT NULL, L_DISCOUNT NUMERIC(15,2) NOT NULL, L_TAX NUMERIC(15,2) NOT NULL, L_RETURNFLAG CHAR(1) NOT NULL, L_LINESTATUS CHAR(1) NOT NULL, L_SHIPDATE DATE NOT NULL, L_COMMITDATE DATE NOT NULL, L_RECEIPTDATE DATE NOT NULL, L_SHIPINSTRUCT CHAR(25) NOT NULL, L_SHIPMODE CHAR(10) NOT NULL, L_COMMENT VARCHAR(44) NOT NULL ) WITH (APPENDONLY=TRUE, ORIENTATION=COLUMN) DISTRIBUTED BY (L_ORDERKEY, L_LINENUMBER); CREATE TABLE PART ( P_PARTKEY INTEGER NOT NULL, P_NAME VARCHAR(55) NOT NULL, P_MFGR CHAR(25) NOT NULL, P_BRAND CHAR(10) NOT NULL, P_TYPE VARCHAR(25) NOT NULL, P_SIZE INTEGER NOT NULL, P_CONTAINER CHAR(10) NOT NULL, P_RETAILPRICE NUMERIC(15,2) NOT NULL, P_COMMENT VARCHAR(23) NOT NULL ) WITH (APPENDONLY=TRUE, ORIENTATION=COLUMN) DISTRIBUTED BY (P_PARTKEY);
使用\COPY命令導入1 GB測試數據,語句如下:
\COPY LINEITEM FROM 'lineitem.tbl' with DELIMITER '|' NULL ''; \COPY PART FROM 'part.tbl' with DELIMITER '|' NULL '';
查看關閉Dynamic Join Filter功能的情況下,Q17查詢的執行耗時。具體步驟如下:
關閉Dynamic Join Filter功能:
SET adbpg_enable_dynamic_join_filter TO off;
執行TPC-H Q17查詢:
SELECT sum(l_extendedprice) / 7.0 as avg_yearly FROM lineitem, part WHERE p_partkey = l_partkey and p_brand = 'Brand#54' and p_container = 'SM CAN' and l_quantity < ( SELECT 0.2 * avg(l_quantity) FROM lineitem WHERE l_partkey = p_partkey );
返回結果如下,查詢耗時為3468ms:
avg_yearly --------------------- 336452.465714285714 (1 row) Time: 3468.411 ms
查看開啟Dynamic Join Filter功能的情況下,Q17查詢的執行耗時。具體步驟如下:
開啟Dynamic Join Filter功能:
SET adbpg_enable_dynamic_join_filter TO on;
執行TPC-H Q17查詢:
SELECT sum(l_extendedprice) / 7.0 as avg_yearly FROM lineitem, part WHERE p_partkey = l_partkey and p_brand = 'Brand#54' and p_container = 'SM CAN' and l_quantity < ( SELECT 0.2 * avg(l_quantity) FROM lineitem WHERE l_partkey = p_partkey );
返回結果如下,查詢耗時為305ms:
avg_yearly --------------------- 336452.465714285714 (1 row) Time: 305.632 ms
通過以上示例可以看出,開啟Dynamic Join Filter功能后,執行時間從3468ms降低到305ms,有效地提升了執行性能。