请问在数据编码(行列混存)的实现中,用户的查询请求(如找到pk为n的某一行),在微块层是怎么转换成row_id的

如题,存储引擎是怎么在微块中定位某条数据的,从sql请求的rowkey到microblock中的某一行是用什么方式做的转换?因为rocksdb的方式是直接用key在block内做二分查找,但是ob的数据编码设计支持microblock内部的随机访问,所以好奇这一步是怎么做的。

补充:也就是存储引擎层的row_ids和rowkey是什么关系?
int ObDictDecoder::batch_decode(
const ObColumnDecoderCtx &ctx,
const ObIRowIndex* row_index,
const int64_t *row_ids,
const char **cell_datas,
const int64_t row_cap,
common::ObDatum *datums) const
{
【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】清晰明确描述问题
【复现路径】问题出现前后相关操作
【问题现象及影响】

【附件】

你好,之后存储相关的开发老师会回复

谢谢您!

ob的微块内部也是一样在做rowkey的二分定位

问题里提到的row_id及使用的接口 和 最开始提问的问题并不是一个路径
后面这个rowid是已经确认了需要的数据索引来批量解码投影的

谢谢,那请问如果是batch_decode批量接口,逻辑也是先用rowkey做二分定位到rowid,然后再进行批量解码吗?

这个一般是scan的时候, 批量拿到符合微块内符合条件的行, 来直接投影啦

1 个赞

就是这个批量找到“符合条件的行”的开始扫描的位置是通过rowkey获取的吗

一般扫描都是一个或多个range, 并没有指定的rowkey了

1 个赞

明白了,谢谢