Things we learned running Postgres 13
pganalyze.com
pganalyze.com
And thanks for sharing, this is a great resource!
Here's what I can find:
- PG 9.6: https://www.slideshare.net/noriyoshishinoda/postgresql-96-ne...
- PG 10: https://www.hpe.com/content/dam/hpe/download/pdf/japan/linux...
- PG 11: https://h50146.www5.hpe.com/products/software/oe/linux/mains...
- PG 12: https://h50146.www5.hpe.com/products/software/oe/linux/mains...
There are more, but those are in Japanese.
In Postgres, a new row is written, and both the new and old coexist in the table. Even after the transaction is committed, the old row stays in the table. VACUUM scans the table, finds rows that are no longer needed, and marks them as okay to overwrite.
In MySQL, the row is overwritten in the table immediately, and then the old row is temporarily written to a separate area (the UNDO Segment), so the old record is available if needed. Since old rows don't accumulate in the main table, there's no need for VACUUM.
> This means more writes to do on updates and makes access to old row versions quite a lot slower, but gets rid of the need for asynchronous vacuum and means you don't have table bloat issues. Instead you can have huge rollback segments or run out of space for rollback.
https://stackoverflow.com/questions/25153532/why-is-it-a-vac...
Edit: Just wanted to explicitly call out that the Robert Haas article linked in the answer is excellent (I am still reading my way through it).
http://amitkapila16.blogspot.com/2018/03/zheap-storage-engin...
https://www.microsoft.com/en-us/research/uploads/prod/2019/0...
SQL Server has something called "background cleanup" when this feature is enabled, which takes place in a separate process called "the cleanup process" - just like VACUUM. The paper itself explicitly acknowledges the similarity. All of the advantages the paper claims for CTR/ADR are also advantages for Postgres.
It's also true that both traditional SQL Server (SS with ADR/CTR disabled) and MySQL have background cleanup processes of their own for indexes, but that is a little different. It's about asynchronously reclaiming space for index entries that were already delete-marked.
MyRocks storage, however, only appends data, and requires regular Compaction to clean up old rows, similar to Postgres VACUUM.
Systems that closely adhere to traditional 2PL designs such as InnoDB or DB2 end up with tight coupling between recovery, concurrency control, and storage. This has many consequences, both good and bad. It's no coincidence that Postgres can support quite a variety of index access methods, including support for transactional full text search. You get the transactional stuff "as standard" with the Postgres approach to versioned storage. There is no need to bake concurrency control into each and every index access method.
I would hope and expect MySQL does that in reverse order, as “yeah, we have that row in memory” isn’t a good answer to “are you sure you can roll back that change if needed?”
https://github.com/jakeogh/pubchemmer/blame/master/README.md
Like a painter, you must know when to stop painting. This is a real dilemma all painters face, especially when dealing with watercolor. If anyone has tried painting here, you know exactly the problem - how do you know you're done? It applies to writing and music as well, but it is more evident in visual arts than any other field.
I wish there was a Postgres branch that took previous version and then just applied optimizations and bugfixes. No more.
To be fair, quoting from the article:
> There are no big new features in Postgres 13, but there are a lot of small but important incremental improvements. Let's take a look.
But also, in general, yes there are pieces of software that do this - most recently Moment.js[1]. There was some discussion earlier this week[2].
Not much on .0 versions, those are more feature packed, but all the other time.
Occasionally, there are cases that could be argued to be exceptions to the general rule. But that's a hard argument to make -- everything committed to a back branch is officially a bug fix. Things like optimizer regression fixes are "performance enhancements" in a certain sense, but are nevertheless justified as bug fixes.
And while there are cases where I might agree with the general sentiment, I strongly disagree with this for Postgres. The new features are important and useful. Postgres is not a very specialized tool, it is a general purpose database that is used in many different ways. It isn't just done and feature-complete, there's still a lot of potential to improve it for various use cases.
You presuppose that Postgres (or all software) is comparable to art, without making or explaining the comparison.
You say that "you must know when to stop painting", but what if the developers behind Postgres know when to stop, and it just isn't finished?
What makes you reason that Postgres is finished?
Optimizations kind of are features (sometimes kinda bugs too). Why should those be singled out vs other features?
The primary "bottlenecks" using postgres are different for different people. For you it may be performance. For others it's easier administration. For others it's SQL level query capabilities. Etc.
Of course, that is a lot more work than posting comment...
If you want to move very slowly and deliberately, you can do, depending on your requirements.
I'm afraid if postgres stopped adding features now, in 10 years it would no longer be relevant in software development. Most developers would probably jump ship to a more innovative database.
The world changes, which means requirements change. What was once good enough, will be insufficient in the future if you don't update it.
Some people need or benefit from things that don't interest you. If that's the case with a RDBMS, why not just... not upgrade?
-- Jack Cohen