我正在使用ignite C ++ API,试图找到一种方法来执行SqlFieldsQuery来选择特定的字段,但是想对一组键进行此操作。

一种方法是像这样执行SqlFieldsQuery,

SqlFieldsQuery("select field from Table where _key in (" + keys_string + ")")


其中keys_string是键列表,以逗号分隔的字符串形式出现。

不幸的是,与仅对键集cache.GetAll(keys)进行keys相比,这花费了很长时间。

是否有另一种更快的方法来从点火缓存中获取一组键的特定字段?

编辑:

阅读答案后,我尝试将查询更改为:

auto query = SqlFieldsQuery("select field from Table t join table(_key bigint = ?) i on t._key = i._key")


然后,从我的一组键中添加参数,如下所示:

for(const auto& key: keys) query.AddArgument(key);


但是在运行查询时,出现错误:

Failed to bind parameter [idx=2, obj=159957, stmt=prep0: select field from Table t join table(_key bigint = ?) i on t._key = i._key {1: 159956}]

显然,这是行不通的,因为只有一个'?'。

因此,我然后尝试传递键的vector<int64_t>,但出现一个错误,该错误基本上说std::vector<int64_t>并不专门用于点火BinaryType。因此,我按照定义的here进行了此操作。致电时

writer.WriteInt64Array("data", data.data(), data.size())


我给字段取了一个任意的名字“数据”。然后导致错误:

Failed to run map query remotely.

不幸的是,C ++ API既没有完善的文档,也没有完整的,所以我想知道我是否丢失了某些东西,或者该API不允许将数组作为参数传递给SqlFieldsQuery

最佳答案

使用IN子句的查询并不总是正确使用索引。解决方法如下:https://apacheignite.readme.io/docs/sql-performance-and-debugging#sql-performance-and-usability-considerations

另外,如果您可以选择GetAll代替直接按键查找,则应该使用它。无论如何它可能会更有效。

09-04 06:49