内存深度向量化框架首次在 Oracle Database 21c 中引入。利用新框架的第一个功能是内存中矢量化连接。在 Oracle Database 23c 中,内存深度矢量化已扩展为支持以下附加连接类型:
• 多级散列连接
• 多重连接键
• 半连接
• 外连接
• 按聚合进行完整分组
此增强功能通过利用单指令、多数据 (SIMD) 向量指令来实现额外的性能。我使用 Oracle Database 23c Free 作为后面的示例以及 SSB 模式。
还有一个细节。与连接组类似,内存中深度向量化是 SQL Monitor 捕获的运行时决策。通过单击散列连接操作的双筒望远镜,可以在 SQL Monitor 活动报告中显示内存中深度向量化的使用情况。例如:
请注意,第一个统计数据“DeepVec Hash Joins”设置为 1。这意味着执行了深度向量连接。还有第二种方法可以使用 SQL 显示相同的信息。以下 SQL 语句将显示基础 SQL Monitor 表中的相同信息:
set echo off
set trimspool on
set trim on
set pages 0
set linesize 1000
set long 1000000
set longchunksize 1000000
PROMPT Deep Vectorization Usage: ;
PROMPT ------------------------- ;
PROMPT ;
SELECT
' ' || deepvec.rowsource_id || ' - ' row_source_id,
CASE
WHEN deepvec.deepvec_hj IS NOT NULL
THEN
'deep vector hash joins used: ' || deepvec.deepvec_hj ||
', deep vector hash join flags: ' || deepvec.deepvec_hj_flags
ELSE
'deep vector HJ was NOT leveraged'
END deep_vector_hash_join_usage_info
FROM
(SELECT EXTRACT(DBMS_SQL_MONITOR.REPORT_SQL_MONITOR_XML,
q'#//operation[@name='HASH JOIN' and @parent_id]#') xmldata
FROM DUAL) hj_operation_data,
XMLTABLE('/operation'
PASSING hj_operation_data.xmldata
COLUMNS
"ROWSOURCE_ID" VARCHAR2(5) PATH '@id',
"DEEPVEC_HJ" VARCHAR2(5) PATH 'rwsstats/stat[@id="11"]',
"DEEPVEC_HJ_FLAGS" VARCHAR2(5) PATH 'rwsstats/stat[@id="12"]') deepvec;
这将以以下格式显示:
Deep Vectorization Usage:
-------------------------
2 - deep vector hash joins used: 1, deep vector hash join flags: 24576
以下是现在利用内存深度向量化的半连接示例:
select /*+ MONITOR */ count(l.lo_custkey)
from lineorder l
where l.lo_partkey IN (select p.p_partkey from part p)
and l.lo_quantity
SQL> set echo off
Deep Vectorization Usage:
-------------------------
2 - deep vector hash joins used: 1, deep vector hash join flags:
5 - deep vector hash joins used: 1, deep vector hash join flags: 8192
7 - deep vector hash joins used: 1, deep vector hash join flags: 8192
9 - deep vector hash joins used: 1, deep vector hash join flags: 24576
这是一个非常令人兴奋的增强。请注意,不需要布隆过滤器,并且我为此查询禁用了向量转换以显示多级连接的工作原理。深度向量连接不直接支持向量转换,但同一计划中的其他哈希连接可以利用深度向量连接。还有一件事需要注意。多级深度向量连接支持左深、右深和某些类型的浓密连接。
还有另外两个数据库内存功能也可以改进深度向量连接。加入组和内存中动态扫描 (IMDS)。连接组通过同步相同或不同表中列的字典值来提供帮助,从而使连接组中的列的连接速度更快。 IMDS 提供了扫描改进,因为它在 IMCU 级别上并行化扫描。加入组必须显式定义,或者可以由 23c 中的自动内存中 (AIM) 定义。在 CPU 容量过剩且 CPU 数量超过 24 的系统上,资源管理器将自动启用 IMDS。前面的示例中没有使用这些功能,但可以为较大的数据库提供实质性的额外性能改进。