2014-03-07 37 views

回答

1

在我的理解中,只有爲查詢運行提供實時索引。在索引的幫助下,只有相關數據需要從存儲服務中獲取,但只有在本地緩存中尚不可用時才需要。

1

數據不駐留在對等體上,僅存在於索引中。在運行查詢時,對等方會遍歷最合適的索引以查找需要從存儲服務檢索的節點。因此,從對等體到存儲服務的實際查詢僅請求在索引查詢中到達的id。索引大小可能相當大,具體取決於存儲的數據量,但只能從存儲服務中檢索所需的數據。

Datomic沒有表連接的概念,所以我很想知道你在這裏的含義。不同的分區或數據庫?

+0

謝謝!關於你的問題:我只是指傳統上屬於外鍵 - 主鍵內連接場景的東西。不知道他們是不同的分區或數據庫。當我學習更多時,也許我會更新一個更聰明的問題。 – vijucat

0

簡短的回答是:

Datomic維護幾個索引,每個索引按不同的標準排序。這些索引中的每一個都被拆分成段,每個段包含數千個數據項(datoms)。沒錯,數據本身包含在索引中。

在進行查詢時,Datomic將只檢索執行查詢所需的那些索引段。隨着索引排序,Datomic可以確定它需要哪些分段。由於它以段爲單位檢索索引數據,它將始終包含一些您不感興趣的數據 - 但這似乎是解決管理和通信開銷的一個相當不錯的折衷方案,並且會在實踐中提高性能。

在所有的典型查詢中,沒有完整數據庫掃描是必要的。在需要的情況下,對等方確實必須將所有數據提交到本地系統。然而,這並不意味着所有數據都會同時駐留在內存中 - 除非您的查詢結果包含所有數據 - 因爲Datomic會在處理完成後垃圾回收段並且不再需要,以防內存不足。

也就是說,order of where clauses in queries is important for performance,雖然我不能說,如果順序影響檢索索引段的數量。

有關索引的更多信息,請參閱Datomic indexes page和Nikita Prokopov的Unofficial guide to Datomic internals

相關問題