But to steel man this a little. Joins can be cheap if you understand how they work and what the patterns of use are. I've worked on systems where that billions of rows to millions scenario is a thing. I recall working on a particularly nasty legacy query underpinning a report that took most of a day to finish that I managed to get down to tens of seconds just by tweaking a bunch of things to join right.
If you have billions of rows you need to search through for a single row, it will be costly unless you have the appropriate indexes. Storing data in JSON fields or similar is only going to make it slower.
If you are only selecting a single row, a join will be instantaneous. If you are joining many rows on either side it has a cost, but so has denormalized data since you just need to scan through that many more rows. Sure in certain specific cases denormalization can be a valid optimization, but in the general case it will just make queries slower.
Saying joins are cheap or expensive only makes sense when comparing to the alternative.
Exactly. It's not like the join materializes explicitly in memory.
This has all been known for decades since the beginning of relational databases. That's why taking a DB class is valuable, or at least reading a good DB fundamentals book.
I used the 5th edition, but have heard the 6th edition apparently regressed. There's now apparently a 7th edition that I can't comment on.
With a sufficiently small database, even non-indexed joins may appear fast.
If your database has billions of rows or more, then even indexed joins will need to be used judiciously, especially if you have a lot of indexes. The indexes will probably also become very large on disk (possibly 100s of Gb), and they'll also degrade the performance since more than likely the system will struggle to keep them in RAM.
Materialize views for high-performance querying.
Even if you don't denormalize, there's plenty of optimizations for joins: e.g. a bitmap join index can optimize a millions x billions join pretty well!
DB guy with 25+ years experience. Summary: it depends.
> joins are never cheap
it depends. On table size, indexes/table size vs how expensive the alternative is. Always!
> tables with billions of rows crossed with millions of rows just to find a single row with data is not something i would call cheap
indexes
> more often than not it is better to avoid joining large tables if you can live with duplicate data
10E9 x 10E6 = 10E15 (at worst anyway). A join via an index will save you colossal amounts of IO (though as ever, it depends).
Problem here isn't this mostly clueless advice (discarding/archiving unnecessary data is the only good idea here, and it's not used as often as it should be). Problem is strong opinions put forth by someone who doesn't have the necessary experience, or understanding of what's going on under the hood. Denormalising is a useful tool that IME rarely gains you more than it loses you, but this 'advice' is just going to lead people down the wrong alley, and I'm tired of suchlike n00b advice strongly (and incorrectly and arrogantly) expressed on HN.
But those are details for the database engine to handle. And, as you said, indexes
select * from (select * from tbl) as subqry where subqry.col = 25
would be rewritten by any halfway decent optimiser to select * from (select * from tbl where tbl.col = 25)
(and FTR the outermost select * would be stripped off as well).Good DB optimisers do a whole load of that and much more.
Joining onto either table a or table b is something that REALLY trips optimizers up.
How else could I have posted better? Honest question.
> this mostly clueless advice
> strong opinions put forth by someone who doesn't have the necessary experience, or understanding of what's going on under the hood
> I'm tired of suchlike n00b advice strongly (and incorrectly and arrogantly) expressed on HN
You continue to just say it depends without giving any actual scenarios. You make it sound like magic, but it’s not: “under x and y, do z except when u” is better than “it depends, I’m sick of all these noobs”.
Also, your main points are against denormalization and avoiding large table joins which are 100% rational arguments under certain workloads.
His was stupid advice and had it should not have been given.
> You continue to just say it depends without giving any actual scenarios
it depends. Use your common sense and then use a stopwatch, is a good start. There are entire shelves of books on this, I won't repeat them.
> You make it sound like magic, but it’s not:
absolutely true!
> “under x and y, do z except when u” is better than
it's a multidimensional problems inc. memory size, disk size, the optimiser, sizes of particular tables joined, where the hotspot is, cost of updates of non-normalised tables, etc. I can't give general advice from here.
> Also, your main points are against denormalization and avoiding large table joins which are 100% rational arguments under certain workloads.
I said "Denormalising is a useful tool that IME rarely gains you more than it loses you,"
I don't accept your criticism.
To your question, probably longer than you but I've always more to learn.
Um ..yes? It's cheap if you got your indices right. A hash table doesn't really care if there are 20 or 20B entries.
I am sure i have heard strong opinions like this but in practice joins are never cheap, tables with billions of rows crossed with millions of rows just to find a single row with data is not something i would call cheap, more often than not it is better to avoid joining large tables if you can live with duplicate data, also one trick i have found better is just to archive data in your tables which are not accessed frequently and reduce the size of tables keeping only the data which is needed