Column-oriented database

来源:互联网 发布:财汇金融数据库 编辑:程序博客网 时间:2024/06/08 15:51
首先参考了这篇不错的wikipedia:

http://en.wikipedia.org/wiki/Column-oriented_DBMS

对面向列的数据库管理系统的大概说明,应首先参考上文。之后是我对文中一些地方的理解。

基本上列存储的好处就是:
1,在特定应用场合可以大大减少IO。
在仅涉及一个或几个字段的场合可以大大减少IO。

字段越多,需要读取的block就越多。既然关系型数据库是行存储,那么字段较少时,例如一个block可以存储50行数据,而字段过多时只能存储20行数据。这样同样操作100行数据,之前需要读取2个blocks,而现在需要读取5个。大部分情况下,我们并不需要一行中的所有字段。当我们实际需要的仅仅是几个字段时,由于行存储而被同时读取的其他字段就会被白白丢弃。由于业务逻辑等原因,一个表的字段越多,一次操作可能被读取的无用字段或信息就越多。因此字段过多会导致性能严重下降。

另外从下面这个例子可以看出,如果字段内容相同,列存储可以进一步减少存储和IO。

…;Smith:001,Jones:002,004,Johnson:003;…

即对于002,004行来说,name字段的值都是Jones。而在行存储中,Jones将被重复存储两次。

2,理论上字段可以任意多

设计关系型数据库的时候有一个原则就是一个表的字段不能过多,如果太多就应该分成多个表。其理由如上所说。

因此关系型数据库对字段数量有上限,同时也有建议值。

例如 SQL Server:

http://msdn.microsoft.com/en-us/library/ms143432.aspx

但是在面向列的数据库中则完全没有这个问题。每次读取只会涉及本次查询所需要的字段,因此不存在连带读取了不需要的字段的问题。同一行数据的不同字段之间用row id相连,因此理论上一个collection可以有任意多个字段,同时不会对性能有重大影响。

但是由于磁盘读取永远以block为最小单位,因此面向列的数据库同样存在连带读取无用信息的问题。这种浪费和block大小的设置直接相关。

3,压缩

既然物理存储是列的聚合体,那么它们就具有相同的数据类型,同时数据重复度也会较高。因此和行存储相比,就会有更高的压缩比。面向列的数据库同关系型数据库相比,更适合压缩存储,从而进一步减小磁盘IO。


既然列存储在特定场合可以减小IO,那么它就有不适合的情况。文中明确指出:
对于Column-oriented database,It would appear that operations that retrieve data for objects would be slower, requiring numerous disk operations to collect data from multiple columns to build up the record.
In practice, row-oriented storage layouts are well-suited for OLTP-like workloads which are more heavily loaded with interactive transactions. Column-oriented storage layouts are well-suited for OLAP-like workloads (e.g., data warehouses) which typically involve a smaller number of highly complex queries over all data (possibly terabytes).

我们来分析一下上面这句话。OLTP系统更适合关系型数据库,因为OLTP更多的基于行操作而不是批量操作。例如一个银行交易系统,真实用户的大部分操作都是基于某一笔具体的交易(例如一笔汇款),或小规模的数据操作(例如查询自己本月的所有交易记录),而较少有超大规模的操作。如下面这段文字所说:
Row-based systems are not efficient at performing operations that apply to the entire data set, as opposed to a specific record.
同时OLTP更多的是操作多个字段,例如用户资料或产品资料,一条记录中的大部分字段都会被查询并展示给用户。此时使用行存储可以在一次查询中将相关字段全部取出,提高了效率。
而OLAP一般并非为终端用户服务,而是用于其他应用,如数据分析等。此类系统往往数据量巨大,同时多为对海量数据的查询分析,这也就是关系型数据库的短板。同时由于data warehouse经常是针对维度的批量查询(为了简化理解,这里我们可以认为一个维度对应一个字段),使得column-oriented DB对于此类应用尤为合适。而在关系型数据库中,我们需要通过使用索引才能较快的完成此类操作。


原创粉丝点击