【问题标题】:Hector API SliceQuery versus ColumnQuery performanceHector API SliceQuery 与 ColumnQuery 性能
【发布时间】:2012-09-22 12:48:02
【问题描述】:
我正在编写一个使用 Hector 访问 Cassandra 数据库的应用程序。在某些情况下,我只需要查询一列,而在某些情况下,我需要一次查询多列。编写一个采用列名数组并使用 SliceQuery 返回列列表的方法在代码方面是最简单的,但我想知道与使用 ColumnQuery 相比,将 SliceQuery 用于一列是否存在明显的缺点。
简而言之,对于一列使用 ColumnQuery 而不是 SliceQuery 是否有足够的(或任何)性能优势,值得额外的代码单独处理一列的情况?
【问题讨论】:
标签:
performance
cassandra
hector
【解决方案1】:
通过查看 Hector 的代码,使用 ColumnQuery (ThriftColumnQuery.java) 和 SliceQuery (ThriftSliceQuery.java) 之间的区别在于发送不同的 thrift 命令 - “get”或“get_slice”(分别)。
我没有找到关于 Cassandra 的服务器如何实现这些操作的确切文档,但我快速浏览了 Cassandra 的源代码,在检查了 CassandraServer.java 之后,我得到的印象是在查询单个列时,“get”操作更多的是为了客户的方便而不是为了更好的性能:
- 对于“get”请求,会创建并执行
SliceByNamesReadCommand 实例。
- 对于“get_slice”请求(假设您使用的是 Hector 的
setColumnNames 方法而不是 setRange),将为每个想要的列创建一个 SliceByNamesReadCommand 实例,然后执行(该行只读取一次不过)。
最重要的是,据我所知,创建一些用于处理多列的集合的(可忽略不计的)开销并不多。
但是,如果您仍然担心,我相信在您的 DAO 中使用 Hector 时,以不同方式处理这两种情况应该不会太难。
希望我能提供帮助。