Postgres SELECT DISTINCT Does Not Scale

(dbos.dev)

98 points | by KraftyOne 2 days ago

7 comments

  • nattaylor 22 hours ago
  • procaryote 18 hours ago
    I've generally started to treat use of SELECT DISTINCT as a warning flag, as it's very common that it indicates bad code

    Some use it because they don't understand uniqueness constraints and try to fix it in post so to say. Some use it because they forgot a join condition and are absolute amateurs. Some use it because it fixed a problem for them once and now they add it everywhere

    These people seem to outnumber the people who use SELECT DISTINCT in a well thought out manner

    • gregw2 11 hours ago
      This. 100%. So on point.

      I'd only add one more observation.

      Sometimes the root cause is poor table design (or in analytic/OLAP use cases poor ETL design without proper data validation checks or handling) where uniqueness is not enforced and that is the root cause that should be fixed if at all possible. A "first normal form" violation in the database design so to speak.

      If that root cause is not addressed, then SELECT DISTINCT is more often necessary and the SELECT DISTINCT disease to be safe culture and behavior in the code base on top of the database just spreads.

      • thom 15 hours ago
        Yeah, it's almost always more intention-revealing to use CTEs and WHERE EXISTS.
        • photios 17 hours ago
          Yeah, people have been advising against DISTINCT for ages. I guess that piece of common wisdom somehow got lost in this age of AI wonders. :D
          • Dylan16807 18 hours ago
            It's definitely a warning flag if you're applying it to full-ish rows. This situation seems much more innocuous to me.
          • atemerev 16 hours ago
            Well, if the solution is a manual workaround that forces a better query plan, this needs to be a part of Postgres itself so it builds better query plans automatically.
          • thesuperevil 19 hours ago
            [flagged]
            • colenikol2 17 hours ago
              [dead]
              • sandeepkd 19 hours ago
                It says that the company is co-founded by Postgres creator. I find that bit hard to believe given that there is nothing novel in the article, probably discovery for them. I do understand that everyone has to go through their own journey to learn these things but at the same time when you are running business then seeking professional help isnt a bad idea.

                Based on my experience queries like these cannot scale, whatever you do. However if you are already on a path where you had invested a lot in such queries then hire a DBA, if you are not far off then hire an architect to model the data for better performance.

                • atombender 14 hours ago
                  My understanding (possibly flawed) is that Stonebraker isn't directly involved anymore.

                  The original idea that he worked on with the DBOS people at MIT and Stanford was very different and much, much more ambitious, which is why the name DBOS seems a little out of place now. The original idea was much closer to a "database OS".

                  Here [1] is the paper, which proposes that "To improve the scalability, security and operability of OSes, we propose a data-centric architecture: designing the OS to explicitly separate data from computation, and centralize all state in the OS into a uniform data model. In particular, we propose using database tables, a simple data model that has been used and optimized for decades, to represent OS state. With the data-centric approach, the process table, scheduler state, flow tables, permissions tables, etc all become database tables in the OS kernel, allowing the system to offer a uniform interface for querying this state."

                  The team later published another paper based on their prototype work [2].

                  Instead, they basically implemented Temporal as a client library with Postgres as the state layer. It's good, but only tangentially related to the original vision.

                  Maybe the long-term plan is an actual database OS, but it kind of looks like they decided they had to pivot to something much simpler, and slapped on an "for AI" like everyone is doing these days.

                  [1] https://arxiv.org/abs/2007.11112

                  [2] https://dl.acm.org/doi/10.14778/3485450.3485454

                  • Dylan16807 18 hours ago
                    Scale with what? If you have m distinct values in an index, then listing them this way takes m log(n) time, which is fine for many use cases no matter how much data you have.
                    • sandeepkd 18 hours ago
                      The way the OP is trying to achieve all the goals by pushing the complexity on the queries/database is what I am referring to as non-scalable as data grows on SQL DB.

                      > If you have m distinct values in an index, then listing them this way takes m log(n) time, which is fine for many use cases no matter how much data you have.

                      And NO the runtimes are not right away applicable on machines at scale. You are dealing with DB locks, page sizes, available memory, existing data in memory, queue depth. Experienced folks get paid to short circuit such learnings

                      • Dylan16807 18 hours ago
                        Selecting distinct values of a single column with a simple condition is hardly pushing complexity into the database.
                        • adrianN 18 hours ago
                          Runtimes are usually pretty well applicable at scale, it’s just that most people don’t have a good intuition about asymptomatic notation. Constants and lower order terms matter a lot in practice but are hidden in asymptotic notation.
                      • stemchar 18 hours ago
                        It's Stonebraker, he has a history of doing this to sell shit to people who don't need it.
                      • DiabloD3 22 hours ago
                        "Postgres SELECT DISTINCT Does Not Scale"

                        Correct. This is documented in depth: DISTINCT sorts the results first.

                        The article's use case seems to imply the author did not know about GROUP BY, nor does it imply the author knew about indexes, nor ANALYZE. Postgres 18's new skip scan indexing also could help here, so ensuring the planner chooses that could help.

                        • Dylan16807 22 hours ago
                          Would GROUP BY fix the issue?

                          The article explains that skip scan doesn't do anything here.

                          > nor does it imply the author knew about indexes, nor ANALYZE

                          Indexes were talked about a lot, and they explicitly mentioned looking at the query plan.

                          • DiabloD3 19 hours ago
                            The article seems to have changed since I commented.
                            • Dylan16807 19 hours ago
                              • Twisell 19 hours ago
                                Why don't he use GROUP BY on indexed columns was my first thought also.

                                I guess we just have to patiently wait for the OP to hopefully read Postgres documentation from postgreSQL 10.x before correcting the article again.

                                • SkiFire13 15 hours ago
                                  > Why don't he use GROUP BY on indexed columns was my first thought also.

                                  Because it has the same issue.

                                  SELECT DISTINCT and GROUP BY are equivalent from a query planner perspective.

                                  • Dylan16807 18 hours ago
                                    Does that fix it? Why would people be trying to add new index scanning modes if that's enough to fix it?

                                    Someone else said it doesn't.

                                • gfody 19 hours ago
                                  nope - either gets you a HashAggregate, GroupAggregate, or Unique depending on whether the column/input is indexed/ordered
                                • tpetry 21 hours ago
                                  Did you even read the article? They show that a perfect index for their query didnt help because Skip Scan is currently not used for DISTINCT queries.