日期:2014-05-16  浏览次数:20592 次

列数据库的文件结构设计(笔记)

  之前的毕业设计做了一个关于列数据库文件设计的课题,最近抽空回头看了一下那论文,当时觉得浪费了时间,现在想来这课题还是蛮有意义的。最终也通过代码实现了数据的列式存储,虽然大部分代码不是我写的,但至少把他弄懂了。以下内容仅用作学习笔记,可以看做是自己的功课温习,嘿嘿。

----------------------------------------------------------------

(1)列数据文件总体结构

  列数据库的数据一般以文件的形式存储在磁盘中,每个表的每个字段的记录会存在不同的文件中,在进行数据的增删查改操作时需要进行文件的IO操作。在列数据库存储数据时,关系表中的数据将会按字段来分别存储,同一字段的数据段被存在同一个文件中,不同字段的数据段被存在不同文件中,如下图所示。


  这样的存储方式的一个好处是: 由于每个数据文件中的数据都是同一个表中的同一个字段,那么在进行向量化数据查改操作时只需要打开相关的数据文件进行数据读取,这样的话可以避免打开整个表的遍历,相对的减少了IO操作(IO操作在海量复杂数据中限制了查询效率的提升)。而传统关系数据库的查询则牵涉到打开整个表的操作,因此在进行海量数据的查询时IO消耗的时间将会相当明显,这也是抑制了数据查询性能的一个重要因素。

(2)列数据文件头结构

  数据文件主要是以4K为单位进行分页,文件头占据了开头的一页,在页号一项中记录为0。也就是文件头是占据了4K空间的数据块,如下图所示是文件头的主要内容项布局。


   对于定长字段和不定长字段,各自的存储方式是不一样的。对于定长字段,记录是按先后插入的顺序在数据页中有序往后存储;程序可以读取文件头中的字段实际大小,存储空间大小,数据项数量等信息来快速查询数据。而对于不定长字段,数据页中多了一个关于字段的偏移地址信息;程序将需要通过文件头的信息和偏移地址来有序读取数据页中的数据。