“在应用程序进程空间中运行的Datomic查询”:这是否意味着查询必须运行的所有数据也必须是本地的?假设我在两个表上运行连接,每个表的大小都是1 GB,Datomic是否首先将2 GB数据检索到要运行查询的Peer上?
对不起,如果这个问题已在文档中得到解答,我应该RTFM。
答案 0 :(得分:1)
据我所知,只提供实时索引才能运行查询。在索引的帮助下,只需要从存储服务中获取相关数据,但前提是它尚未在本地缓存中可用。
答案 1 :(得分:1)
数据不驻留在对等体上,只驻留在索引上。运行查询时,对等方会遍历最合适的索引,以查找需要从存储服务检索的节点。因此,从对等方到存储服务的实际查询仅请求在索引的查询中到达的id。索引大小可能非常大,具体取决于您存储的数据量,但它只会从存储服务中检索所需的数据。
Datomic没有表连接的概念,所以我很想知道你在这里的意思;不同的分区或数据库?
答案 2 :(得分:0)
简短的回答是:否。
Datomic维护多个索引,每个索引按不同的标准排序。这些索引中的每一个都被分割成段,每个段包含数千个数据项(数据)。没错,数据本身包含在索引中。
在进行查询时, Datomic将仅检索执行查询所需的那些索引段。在对索引进行排序时,Datomic可以确定它需要哪些段。当它以段为单位检索索引数据时,它将始终包含一些您不感兴趣的数据 - 但这似乎是解决管理和通信开销的相当好的权衡,并将在实践中提高性能。
在所有典型查询中,都不需要完整数据库扫描。如果有必要,对等体确实必须将所有数据提取到本地系统。但是,这并不意味着所有数据将在一个点同时驻留在内存中 - 除非您的查询结果包含所有数据 - 因为Datomic将在处理后不再需要垃圾收集段,以防内存不足。 / p>
那就是order of where clauses in queries is important for performance,虽然我不能说订单是否会影响检索到的索引段的数量。
有关索引的更多信息,请访问Datomic indexes page和Nikita Prokopov的Unofficial guide to Datomic internals。