c++ - 点燃 SqlFieldsQuery 特定键

标签 c++ ignite gridgain

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

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

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

哪里keys_string是以逗号分隔的字符串形式的键列表。

不幸的是,与只做 cache.GetAll(keys) 相比,这需要很长时间对于键集,keys .

是否有另一种更快的方法从 ignite 缓存中获取一组 key 的特定字段?

编辑:

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

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 并直接按键查找,那么您应该使用它。无论如何,它可能会更有效。

关于c++ - 点燃 SqlFieldsQuery 特定键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45640331/

相关文章:

c++ - 如何为局部变量分配内存?

C++线程问题

c++ - 使用 SDL 的智能指针

hadoop - Apache Ignite:如何在服务器节点关闭时将客户端节点的连接实例设置为 'NULL'打开?

ignite - Apache 点燃 : how to insert into table with IDENTITY key (SQL Server)

java - 事件 "EVT_CACHE_STARTED"触发后,Apache Ignite 无法从监听器访问缓存

c++ - 通过以下两种方式分配指针对象有什么区别?

caching - 如何在 Apache Ignite 2.0 上存储堆外数据

gridgain - 如何将 gridgain/ignite 统计数据输出到文件

java - Apache 点燃: caching ClusterGroup