Immutable database and Datalog query engine for Clojure, ClojureScript and JS
Fixed pull on filtered dbs #419
Pull has been a great API for a long time in Datomic and DataScript, with only one gotcha: it wasn’t performant. Up to the point where building pull tree manually using entities would outperform pull, even with all entities overhead. This seemed weird, because pull has much more information ahead of time, which could be leveraged for optimizations.
Well, you don’t have to compromise performance for convenience anymore. DataScript 1.3.0 features much faster pull implementation:
Numbers depend on particular database/pattern, so don’t trust them too much!
Also in new impl:
[* {:child ...}]
did not work beforedatascript.query/*query-cache*
Some raw numbers from built-in benchmark (ms per operation, lower is better).
Clojure:
Benchmark | Entities | Old pull | New pull |
---|---|---|---|
pull-one | 0.6 | 2.5 | 0.5 |
pull-many | 1.9 | 5.4 | 0.8 |
pull-wildcard | n/a | n/a | 1.1 |
ClojureScript:
Benchmark | Entities | Old pull | New pull |
---|---|---|---|
pull-one | 1.7 | 7.3 | 1.3 |
pull-many | 5.2 | 15.1 | 2.2 |
pull-wildcard | n/a | n/a | 2.8 |
Datomic in-memory:
Benchmark | Entities | Pull |
---|---|---|
pull-one | 0.7 | 0.8 |
pull-many | 2.3 | 2.5 |
pull-wildcard | n/a | 4.7 |