AlloyDB for PostgreSQL under the hood: Columnar engine
cloud.google.com
cloud.google.com
This is exactly what a HTAP(Hybrid Transactional and Analytical Processing) system does.
Columnstore was previously known as InfiniDB and Xpand, Clustrix. Both have been in production for over 10 years and I have been a very happy user of them.
The list of supported extensions [1] is interesting and covers the biggies. Still, it always kills me that these hosted "Postgres+" solutions end up meaning no third party extensions. ZomboDB (easy ElasticSearch integration) is a PG extension I've always wanted to try, but haven't been able to.
[1] https://cloud.google.com/alloydb/docs/reference/extensions
Looks like AlloyDB is a result of the influx of Oracle and SAP database people into GCP.
We use ZomboDB heavily, and the lack of extension support in AWS/Google cloud offerings prevents us from switching.
At least in my experience, most of the time the analytical queries to generate some kind of business report or display statistical graph UI on admin dashboard or whatever, need not be run few times a second. If you run ad-hoc analytical queries all the time, no matter how advanced is the database, you will bring it to its knees in some way.
You can use old age tricks to enhance both OLTP and OLAP performance, master-associate (3NF or maybe 4NF) table to distribute columns across various tables, individual table partitioning, advance indexing feature of Postgres and periodic refresh of Materialised View to get decent performance.
Columnar storage. Vertica was the real innovator. Redshift, BigQuery, Snowflake, Citus, Timescale, etc just took the idea and ran with it.
I wonder if there are performance tradeoffs sometimes leading to slower than vanilla postgres?
> I wonder if there are performance tradeoffs sometimes leading to slower than vanilla postgres?
Speculation: alloydb probably has both a row store and a column store and some fancy logic to decide which one to use. That's usually what HTAP means.
In very broad strokes, columnar data stores struggle if you select many columns.
Theres not really any free lunch here, vanilla postgres is optimized to perform well within the constraints of a single scale-up host, minimizing storage usage as much as possible.
These Aurora style systems instead take the assumption that storage is relatively cheap in a cloud environment, and likewise with any compute task that can be scaled out instead of up. So move as much as possible out of the scale-up instance to scale-out storage and compute.
Additionally Google is claiming their system is better than Aurora because google has a distributed filesystem, where AWS only has block storage (tied to specific compute) and object storage (much worse performance).
This was very much the main lesson I got reading up on DataDog's third-gen event storage system Husky[1]. Great read.
[1] https://www.datadoghq.com/blog/engineering/introducing-husky... https://news.ycombinator.com/item?id=31416843 (185 points, 9d ago, 15 comments)
edit: column stores existed before c-store, but c-store did some very nifty stuff around integrating compression awareness into the query executor
If you want to be technical, C-Store was the real innovator...and those people refined and commercialized it as Vertica.
There is a longstanding heuristic that, outside of the workload for which Postgres was designed, a state-of-the-art database implementation will be 100x faster on the same hardware. That heuristic is well-grounded in reality in my experience; I often measure new database kernel implementations relative to Postgres. Postgres is still great for classic OLTP workloads and you will find that the gap is smaller there. For analytical processing, 100x gain is pretty straightforward.
No one should read this as reflecting poorly on Postgres. Database architecture and the hardware it runs on has evolved enormously in the decades since Postgres was designed. Most people have no sense of just how fast and scalable a modern database kernel is compared to the designs from 20+ years ago.
Where does your 100X slowdown figure come from, and what 'architectural limitations' are you referring to? Genuine question as DBs architectures are interesting to me. TIA
Given they specify analytical workloads, I'm betting a lot of it comes from column storage.
If that alone explained the 100X speedup that would mean the row is storing 99% of data that's not of interest to a query. That would a) be unlike pretty most table structures + queries I've ever seen, but in those cases cases such as when a fat blob is stored in the row, you hive off blobs to a separate table and only join to that when blob's wanted.
I'm missing something big here.
[0] https://15721.courses.cs.cmu.edu/spring2020/papers/08-storag...
[1] https://15721.courses.cs.cmu.edu/spring2020/schedule.html
https://datastation.multiprocess.io/blog/2021-10-18-experime...
Row-based vs columnar-based storage. Latter is more suitable (read much faster) for OLAP workloads.
- The storage engine architecture is obsolete and highly suboptimal. It has no way to accommodate modern high-density or high-bandwidth storage, both of which are the norm now, nor is it possible to implement any of the (very successful) I/O schedule optimization concepts that have emerged in recent years. The net effect is a gross underutilization of the capabilities of modern storage hardware.
- The internal page layout and table architecture in Postgres is a textbook classic but not appropriate for most workloads on modern hardware. Modern page engines need great performance across diverse categories of workloads and data models -- we use databases for a lot more than accounting systems these days -- while also being amenable to aggressive use of hardware optimization like SIMD. Thinking in terms of "row-oriented" and "column-oriented" is a false dichotomy; optimized page engines commonly have many elements of both but are not identifiable as pure expressions of either nor even a simple hybrid (e.g. PAX layouts). This is one of the easiest changes to backport into old database architectures.
- Indexing in some modern systems have been completely reimagined to great effect. Tables are effectively index-organized with no secondary indexing structures but without loss of high query selectivity across diverse columns; there is a separation of the concerns regarding fast search and key constraint enforcement; major increases in index write throughput concurrent with major decreases in storage and memory footprint (no B-tree bloat). For small tables, this optimization has no effect and may even be a mild pessimization depending on the workload. As tables become larger the performance starts to diverge greatly, becoming multiple orders of magnitude faster. The Postgres architecture can't be modified to support this.
If you built a database engine that was approximately state-of-the-art in these three areas, I would expect a 100x difference in performance relative to Postgres for many large data model workloads using server hardware like an AWS i3en.24xlarge. Obviously building such a database would be a hell of a lot of work, it isn't something you can reasonably do for fun on nights and weekends.
What? [deleted] A quick browse then...
> The storage engine architecture is obsolete and highly suboptimal
cite?
> It has no way to accommodate modern high-density or high-bandwidth storage
WTF does this even mean? Storage is a hardware issue, nothing to do with the DB engine. And it has mmap and huge pages <https://www.postgresql.org/docs/current/runtime-config-resou...> so what's it missing?
> nor is it possible to implement any of the (very successful) I/O schedule optimization concepts that have emerged in recent years. The net effect is a gross underutilization of the capabilities of modern storage hardware.
No evidence given.
> Modern page engines need great performance across diverse categories of workloads and data models
It's chunks in memory that's all, how is it failing then?
> Indexing in some modern systems have been completely reimagined to great effect. Tables are effectively index-organized with no secondary indexing structures
just what?
> but without loss of high query selectivity across diverse columns
selectivity is a feature of data, not how it is organised, at all
> there is a separation of the concerns regarding fast search and key constraint enforcement
what? what? what? what? what? what? what? what? Search is a read issue, key constraints are a write issue...?
> no B-tree bloat
seriously WTF?
> As tables become larger the performance starts to diverge greatly, becoming multiple orders of magnitude faster
"multiple orders of magnitude" - Wuuuut? cite please
The page layout is important because many workloads are memory-bandwidth bound. Effective selectivity mechanisms outside the page reduce the need for intra-page selectivity optimization in terms of delivering performance but you still need to preserve memory bandwidth. This biases designs with good page-external selectivity mechanisms to optimize for widening the set of workloads they perform well on instead of squeezing out slightly more selectivity for narrow workloads.
Some of these assertions are self-evident and non-controversial, such as the poor storage performance of Postgres and the issue of B-tree bloat generally. Using mmap() for storage is the low-performance option, articles regarding which are regularly posted on HN, so the fact that it "has mmap" is a good example of why it is expected to perform poorly (though it isn't the only reason in the case of Postgres). I believe there are plans in the works to potentially redesign the Postgres storage layer in future versions, so this may improve at some point.
But more broadly, you seem to be a bit confused about the theory of database kernel design and the tradeoffs that can be made there? You are questioning things about how actual, real, databases, including most open source ones, are designed.
> Effective selectivity mechanisms outside the page reduce the need for intra-page selectivity optimization in terms of delivering performance but you still need to preserve memory bandwidth
"mechanisms/optimization/delivering performance" - these are just aspirational words - exactly what 'selectivity mechanisms'? I can barely make sense of this. In fact, I can't. At all.
> Some of these assertions are self-evident and non-controversial
They aren't self-evident because they aren't evident to me, and as for non-controversial - this is just ducking the question. You're still not justifying anything.
> and the issue of B-tree bloat generally
A btree page will be between 1/2 and completely full. Random insertions should make them ~75% full. In MSSQL I just created a table of ints (clustered PK) and inserted about a million random ints and had a look at fullness (page = 8060 bytes):
- Avg. Bytes Free per Page.....................: 2046.7
- Avg. Page Density (full).....................: 74.71%
yep, so an average of 3/4 full. Bit of expected free space. Where's the bloat you talk of, and what's the alternative structure if this is unacceptable.Edit: this is just leaf nodes. You might claim it's ignoring non-leaf nodes. Check: 4MB data gets you 56K non-leaf. Massive 2,000 factor fanout (8K page / 4 byte ints) is why. So what bloat?
> Using mmap() for storage is the low-performance option, articles regarding which are regularly posted on HN,
for small files, so I understand. For large AFAIK they're good, which is why they're used. So what's the alternative? Point to where HN says mmap is slow for large files.
> that it "has mmap" is a good example of why it is expected to perform poorly
justify this please.
> But more broadly, you seem to be a bit confused about the theory of database kernel design and the tradeoffs that can be made there?
You may be right but you've just handwaved my doubts away without any evidence.
> You are questioning things about how actual, real, databases, including most open source ones, are designed.
I'm questioning your claims in the hope I can understand better. I'm not a total noob. I am wondering why I can't make sense of you posts.
DB2 with BLU Acceleration: So Much More than Just a Column Store
https://db.cs.pitt.edu/courses/cs3551/16-1/handouts/db2BLU.p...
or
Real-Time Analytical Processing with SQL Server
https://www.vldb.org/pvldb/vol8/p1740-Larson.pdf
to get a sense of the gap between postgres/open source databases vs something designed (at least partially) to better support analytical workloads.
Transparency: I work for Timescale
[0] https://twitter.com/DomenicRavita/status/1529963959465435154
Links: https://cloud.google.com/spanner/docs/compute-capacity https://cloud.google.com/blog/products/databases/spanner-has...
AlloyDB takes the same approach and adds some additional optimizations in query execution. It introduces a new caching layer and claims to use ML rather than a simple LRU cache. It also introduces cache-only representations of data in a columnar format, which allows it to greatly speed up analytical queries.