Snel: SQL Native Execution for LLVM
arxiv.org
arxiv.org
https://medium.com/grandata-engineering/introducing-snel-a-c...
We called this new engine “SNEL” as an acronym for “SQL Native Execution for LLVM”. Well, that’s the excuse, actually we chose Snel because that means “fast” in Dutch and the name seemed right to us. from https://arxiv.org/pdf/2002.09449.pdf#page=6
It would be amazing if the world of open-source column stores matured a little bit relative to where we are today...
1) I'd hoped to get caching for JITed queries into 13 (or at least the major prerequisite), but that looks like it might miss the mark (job changes are disruptive, even if they end up allowing for more development time). The nicest bit is that that the necessary changes also result in significantly better generated code.
2) Background JIT compilation. Right now the JIT compilation happens in the foreground. We really ought to only do the IR generation in foreground, and then do the compilation in the background, while continuing with interpreted execution. Only once codegen is done, we'd redirect to the JITed program (there'd be a bit higher overhead during the interpreted phase, rechecking whether to now redirect, but not that large).
3) Improve costing logic. E.g. we don't take the size of the necessary generated code into account at the moment, and we should. The worker count isn't taken into account either.
4) Improve optimization pipeline. There's plenty cases where we don't run beneficial and cheap-ish optimization passes, and there's plenty cases where we run unlikely to be helpful and really expensive optimization passes.
Edit: Added 4).
Look forward to hearing more about it in the future.
For one, storage bandwidth has increased massively (my laptop's NVMe drives can do 2 x 3.2GB/s reads, you can get quite a few into even small servers). While memory latency and CPU throughput have not increased to the same degree.
To benefit from the increases in CPU throughput, one needs to take advantage of superscalar execution. Which isn't significantly possible with interpreted execution.
> SQLite3 compiles queries into bytecode, while PostgreSQL compiles them into AST-like tree structures
FWIW, expressions are compiled into bytecode in PostgreSQL as well. While there'd plenty benefit of doing that for query trees as well, there are not quite as much raw execution speed reason for it as there is for expressions (as the individual "steps" are much coarser, so the tree walk overhead is proportionally smaller).
It's very different from a OLTP workload where a query will read 10s or 100s of rows via a btree index.
The main thing here is the simplicity of the architecture and combining HyPer, careful mmap usage, and having SQLite engine do all the other non-critical work. So this way this system could be implemented on time by 1 main developer (rockstar dev, Marcelo) and a tiny little help from me.
(Actual author of the idea/architecture here, not mentioned on the paper, but that's life, haha)
But memory isn't. With NVMe the disk-memory-gap has shrunk considerably over previous SSDs and HDD RAIDs.
SQL is mostly "do the same thing a billion times", which aligns very closely with generating code for the inner loop, particularly when the inner loop can be generated without branches.
SQL codegen is basically an industry standard for large-scale sql query processing on top of a large-scale column store. I work one of the few engines at this scale which does not do go query stage codegen & instead uses source codegen vectorized primitives instead of query time (Apache Hive, specifically & the only other one in the same style is Google's supersonic engine).
Apache Impala - SQL to LLVM IR (C++)
https://llvm.org/devmtg/2013-11/slides/Wanderman-Milne-Cloud... [PDF]
Gandiva - SQL to LLVM IR (Java)
https://github.com/dremio/gandiva
MemSQL - SQL to MPL to LLVM IR
http://highscalability.com/blog/2016/9/7/code-generation-the...
Greenplum - SQL to LLVM IR
http://engineering.pivotal.io/post/codegen-gpdb-qx/
Postgres 9.4 Vitesse - SQL to LLVM IR
<https://www.postgresql.org/message-id/CAJNt7%3DZ6w5%2BwyeTKK...
Postgres 11 LLVM - SQL to LLVM IR
https://www.postgresql.org/docs/11/jit-reason.html
SparkSQL - SQL to Java source (Janino + javac)
https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark...
And as far as I know Redshift's horrible query compilation performance is derived from using C++ codegen which forks gcc inside (not sure why this is so slow though, almost feels like untuned gcc flags or something).
https://docs.aws.amazon.com/redshift/latest/dg/c-query-plann...