INSERT INTO SELECT旁路导入SELECT读取的数据经过MemTable吗

【 使用环境 】生产环境
【 OB or 其他组件 】OB
【 使用版本 】4.2.1.7
【问题描述】INSERT INTO SELECT旁路导入,SELECT读取的数据经过MemTable吗
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

1 个赞

根据文档库中的信息,可以对您的问题进行如下解答:

1. 旁路导入的定义与机制

旁路导入是一种绕过 SQL 层接口的方式,直接在 data 文件中分配空间并插入数据,从而提高数据导入效率。根据文档内容,旁路导入支持以下语句:

  • LOAD DATA /*+ direct */
  • INSERT /*+ append */ INTO SELECT

旁路导入的特点是直接写入底层存储文件,而不经过传统的 SQL 执行路径。


2. MemTable 的作用

MemTable 是 OceanBase 数据库内存存储引擎的一部分,用于暂存插入、更新或删除的数据。当数据被写入时,通常会先写入 MemTable,然后通过转储(Dump)操作将数据从内存刷入磁盘上的 SSTable。


3. 关于 INSERT INTO SELECT 的旁路导入行为

根据文档片段的信息:

  • 在使用 INSERT /*+ append */ INTO SELECT 进行旁路导入时,数据会直接写入底层存储文件,而不是通过传统的 SQL 执行路径。
  • 因此,SELECT 读取的数据不会经过 MemTable,而是直接写入到目标表的底层存储文件中。

4. 注意事项

  • 原子性问题:文档提到,在 LOAD DATA 操作中,由于采用了并行设计,无法保证整体数据导入的原子性。类似地,INSERT INTO SELECT 的旁路导入也可能存在类似的限制。
  • 适用场景:旁路导入适用于需要高效加载大量数据的场景(如数据迁移、ETL 等),但对于小规模数据插入可能并不适合。

结论

根据文档库中的信息,INSERT INTO SELECT 的旁路导入过程中,SELECT 读取的数据不会经过 MemTable,而是直接写入底层存储文件。这一特性使得旁路导入能够显著提升数据导入性能。

如果您还有其他疑问,欢迎进一步提问!

更多信息请查看:

  1. 旁路导入概述
  2. 使用 SQL 命令进行数据迁移
  3. MemTable
  4. 使用导数工具进行数据迁移
  5. 转储和合并概述
  6. 转储管理概述
2 个赞

旁路导入是直接写入磁盘不会涉及到memtable

1 个赞

读取部分也不经过是吧

1 个赞

根据文档库中的信息,可以进一步解答您的问题。

1. 读取部分是否经过 MemTable

INSERT INTO SELECT 的旁路导入过程中:

  • SELECT 部分:负责从源表中读取数据。这部分的读取行为遵循 OceanBase 数据库的普通查询机制。
  • 根据文档片段关于“弱一致性读”的描述(文档标题:弱一致性读 → 弱一致性读时间戳),查询操作会基于事务快照或分区的最大安全可读位点来决定读取的数据版本。因此,SELECT 部分的读取不会直接涉及 MemTable,而是基于快照读取数据。

具体来说:

  • 如果查询的是已提交的数据,OceanBase 会优先从 SSTable 或者满足条件的副本中读取数据。
  • 只有当查询需要读取最新未提交的数据时,才会涉及到 MemTable 中的内容。

2. 写入部分是否经过 MemTable

对于 INSERT INTO SELECT 的旁路导入:

  • 写入部分直接绕过 MemTable,将数据写入底层存储文件(如 SSTable)。这是旁路导入的核心特性之一,旨在提升写入性能。

3. 总结

  • 读取部分SELECT 的读取行为不会直接经过 MemTable,而是基于事务快照或分区的最大安全可读位点读取数据。
  • 写入部分INSERT 的写入行为不会经过 MemTable,而是直接写入底层存储文件。

如果您还有其他疑问,欢迎继续提问!

更多信息请查看:

  1. IMPORT_INDEX_STATS
  2. 5000 ~ 5999
  3. 弱一致性读
  4. oceanbase.DBA_TAB_PARTITIONS
  5. 事务隔离级别概述
  6. IMPORT_COLUMN_STATS
  7. GET_PREFS

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

两种情况都有考虑,小助手还是厉害

1 个赞

这个回答估计有问题。读取是 MVCC 读,读取的版本数据不一定有快照在磁盘上,依然是要将数据文件中数据读取到租户内存 KVCache 并跟 MemStore 中的增量部分(MemTable)合并读取。

1 个赞

那就是查询部分还是要经过内存

1 个赞

应该是直接导入,主打就是一个速度快

1 个赞