我有一个用C ++编写的应用程序,它使用DataStax C ++驱动程序与Cassandra进行通信。
我运行了2000万个插入,然后使用50个查询来读取这2000万行。我将分区键限制为50个不同的可能值,因此行分区的数量最多为50.此外,每个查询返回大约300,000 - 400,000行。
我正在跟踪此应用程序不同部分的挂钟时间。以下执行查询并获取结果的代码平均需要3秒才能完成,这对我来说似乎是合理的。
stopWatch.start()
CassFuture* result_future = cass_session_execute(session, statement);
if(cass_future_error_code(result_future) == CASS_OK) {
const CassResult* result = cass_future_get_result(result_future);
}
stopWatch.stop()
但是,迭代遍历行的下面一段代码平均需要大约30秒!
resWatch.start();
CassIterator* rows = cass_iterator_from_result(result);
while(cass_iterator_next(rows)) {
const CassRow* row = cass_iterator_get_row(rows);
BAEL_LOG_INFO << "got a row " << BAEL_LOG_END;
}
resWatch.stop();
我意识到CassIterator
可能会迭代大约400,000行,但是在合理的时间内是30秒才能达到这个目标?!
或者是否有一些我对Cassandra功能的方式缺失... cass_session_execute()
,cass_future_get_result()
没有获取与执行的查询相关的所有行并将其返回给客户端?或者是以懒惰的方式做到了?