0

我正在编写一个使用 Hector 访问 Cassandra 数据库的应用程序。在某些情况下,我只需要查询一列,而在某些情况下,我需要一次查询多列。编写一个采用列名数组并使用 SliceQuery 返回列列表的方法在代码方面是最简单的,但我想知道与使用 ColumnQuery 相比,将 SliceQuery 用于一列是否存在重大缺陷。

简而言之,对于一列使用 ColumnQuery 而不是 SliceQuery 是否有足够的(或任何)性能优势,值得额外的代码单独处理一列的情况?

4

1 回答 1

2

通过查看 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 时,以不同方式处理这两种情况应该不会太难。

希望我能提供帮助。

于 2012-10-01T17:58:11.130 回答