「Datomic query run in application process space」 : クエリを実行する必要があるすべてのデータもローカルでなければならないということですか? それぞれのサイズが 1 GB の 2 つのテーブルで結合を実行しているとします。Datomic は最初にクエリを実行するピアに 2 GB のデータを取得しますか?
この質問がドキュメントで既に回答されている場合はすみません。RTFM を使用する必要があります。
「Datomic query run in application process space」 : クエリを実行する必要があるすべてのデータもローカルでなければならないということですか? それぞれのサイズが 1 GB の 2 つのテーブルで結合を実行しているとします。Datomic は最初にクエリを実行するピアに 2 GB のデータを取得しますか?
この質問がドキュメントで既に回答されている場合はすみません。RTFM を使用する必要があります。
私の理解では、クエリを実行するためにライブ インデックスのみが提供されます。インデックスの助けを借りて、関連するデータのみをストレージ サービスから取得する必要がありますが、それはローカル キャッシュでまだ利用できない場合に限られます。
データはピアには存在せず、インデックスのみに存在します。クエリを実行すると、ピアは最適なインデックスを走査して、ストレージ サービスから取得する必要があるノードを見つけます。したがって、ピアからストレージ サービスへの実際のクエリは、インデックスのクエリで到達した ID のみを要求します。保存したデータの量によっては、インデックスのサイズが非常に大きくなる可能性がありますが、必要なデータのみをストレージ サービスから取得します。
Datomic にはテーブル結合の概念がないため、ここで何を意味するのかを正確に知りたいと思っています。異なるパーティションまたはデータベース?
簡単に言えば、いいえです。
Datomic はいくつかのインデックスを保持しており、それぞれが異なる基準でソートされています。これらの各インデックスはセグメントに分割され、各セグメントには数千のデータ項目 (datom) が含まれます。そうです、データ自体はインデックスに含まれています。
クエリを実行すると、Datomic はクエリの実行に必要なインデックス セグメントのみを取得します。インデックスがソートされると、Datomic は必要なセグメントを特定できます。セグメント単位でインデックス データを取得するため、関心のないデータが常に含まれますが、これは管理と通信のオーバーヘッドに対処するためのかなり良いトレードオフのようであり、実際にはパフォーマンスが向上します。
すべての典型的なクエリでは、完全なデータベース スキャンは必要ありません。必要な場合、ピアは実際にすべてのデータをローカル システムにプルする必要があります。ただし、これは、クエリ結果にすべてのデータが含まれていない限り、すべてのデータが一度にメモリ内に存在することを意味するわけではありません。Datomic は、メモリが不足している場合に備えて、一度処理されて不要になったセグメントをガベージ コレクションするためです。
そうは言っても、クエリ内の where 句の順序はパフォーマンスにとって重要ですが、順序が取得されるインデックス セグメントの数に影響するかどうかはわかりません。
インデックスの詳細については、Datomic インデックス ページと Nikita Prokopov の 非公式ガイドの Datomic 内部構造 を参照してください。