1

“在应用程序进程空间中运行的原子查询”:这是否意味着必须运行查询的所有数据也必须是本地的?假设我在两个表上运行连接,每个表大小为 1 GB,Datomic 是否首先将 2 GB 的数据检索到将运行查询的 Peer?

如果文档中已经回答了这个问题,我应该 RTFM。

4

3 回答 3

1

据我了解,仅提供实时索引供查询运行。在索引的帮助下,只需要从存储服务中获取相关数据,但前提是它在本地缓存中尚不可用。

于 2014-03-07T20:13:15.587 回答
1

数据不驻留在对等点上,仅驻留在索引上。当你运行查询时,peer 会遍历最合适的索引来找到需要从存储服务中检索的节点。因此,从对等点到存储服务的实际查询仅请求在索引查询中到达的 id。索引大小可能非常大,具体取决于您存储了多少数据,但它只会从存储服务中检索它需要的数据。

Datomic 没有表连接的概念,所以我很想知道你在这里的意思;不同的分区或数据库?

于 2014-03-11T14:54:11.243 回答
0

简短的回答是:

Datomic 维护多个索引,每个索引都按不同的标准排序。这些索引中的每一个都被分成段,每个段包含数千个数据项(datoms)。没错,数据本身就包含在索引中。

在执行查询时,Datomic 将仅检索执行查询所需的那些索引段。随着索引的排序,Datomic 可以确定它需要哪些段。当它以段为单位检索索引数据时,它总是会包含一些您不感兴趣的数据——但这似乎是解决管理和通信开销的一个很好的折衷方案,并且会在实践中提高性能。

在所有典型查询中,不需要完整的数据库扫描在必要的情况下,对等方确实必须将所有数据拉入本地系统。但是,这并不意味着所有数据将同时驻留在内存中 - 除非您的查询结果包含所有数据 - 因为 Datomic 将在处理后对段进行垃圾收集并且不再需要,以防内存不足。

也就是说,查询中 where 子句的顺序对性能很重要,尽管我不能说顺序是否会影响检索到的索引段的数量。

更多关于索引的信息可以在Datomic 索引页面和 Nikita Prokopov 的 Datomic internals 非官方指南中找到

于 2016-11-24T05:17:06.677 回答