内存存储
有了表之后,我们就可以向其中导入数据了!数据在被持久化存储之前,会首先写入到内存中。 因此在本节中我们会先实现一个内存存储系统(In-memory Storage)。
对于分析型数据库(OLAP)而言,为了读取和计算的高效,它们大多使用列式存储,即同一列的数据在内存中被紧密地排列在一起。 这种数据结构就是我们所熟悉的数组(Array)。
每一列的数据用一个数组表示,多个列的数据就组成了数据块(DataChunk)。和 Array
一样,DataChunk
也是数据库中重要的基础类型。在我们的内存存储系统中,数据就是以 DataChunk
的形式存储在表内。同时它也是未来数据库执行引擎中,各个算子之间传递数据的基本类型。
任务目标
对于四种数据类型:布尔 bool
、整数 i32
、浮点数 f64
、字符串 &str
,实现它们的 Array
,以及用来构建数组的 ArrayBuilder
。
此外,还需实现一个简单的内存存储系统,支持插入、删除表,并支持向表中插入数据、从表中读取数据。
一种可供参考的接口设计:
#![allow(unused)] fn main() { pub struct InMemoryStorage {...} impl InMemoryStorage { pub fn new() -> Self {...} pub fn add_table(&self, id: TableRefId) -> StorageResult<()> {...} pub fn get_table(&self, id: TableRefId) -> StorageResult<Arc<InMemoryTable>> {...} } pub struct InMemoryTable {...} impl InMemoryTable { pub fn append(&self, chunk: DataChunk) -> StorageResult<()> {...} pub fn all_chunks(&self) -> StorageResult<Vec<DataChunkRef>> {...} } }
除此之外,本节没有新增的 SQL 测试。