我正在使用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
代替直接按键查找,则应该使用它。无论如何它可能会更有效。