Oracle 23c 深入探讨 内存中向量连接增强

2024年 5月 6日 69.4k 0

内存深度向量化框架首次在 Oracle Database 21c 中引入。利用新框架的第一个功能是内存中矢量化连接。在 Oracle Database 23c 中,内存深度矢量化已扩展为支持以下附加连接类型:

 • 多级散列连接
• 多重连接键
  • 半连接
  • 外连接
• 按聚合进行完整分组

此增强功能通过利用单指令、多数据 (SIMD) 向量指令来实现额外的性能。我使用 Oracle Database 23c Free 作为后面的示例以及 SSB 模式。

还有一个细节。与连接组类似,内存中深度向量化是 SQL Monitor 捕获的运行时决策。通过单击散列连接操作的双筒望远镜,可以在 SQL Monitor 活动报告中显示内存中深度向量化的使用情况。例如:

Oracle 23c 深入探讨 - 内存中向量连接增强-1

请注意,第一个统计数据“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。前面的示例中没有使用这些功能,但可以为较大的数据库提供实质性的额外性能改进。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论