Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.92) (envelope-from ) id 1j89r5-0006zP-Hv for pgsql-sql@arkaria.postgresql.org; Sat, 29 Feb 2020 21:41:03 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1j89r4-0002YX-9l for pgsql-sql@arkaria.postgresql.org; Sat, 29 Feb 2020 21:41:02 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1j89r3-0002YQ-UT for pgsql-sql@lists.postgresql.org; Sat, 29 Feb 2020 21:41:02 +0000 Received: from li1929-156.members.linode.com ([172.104.219.156] helo=ln-1.useunix.net) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1j89r1-0000ZL-A7 for pgsql-sql@lists.postgresql.org; Sat, 29 Feb 2020 21:41:00 +0000 Received: from wcuddy by ln-1.useunix.net with local (Exim 4.92.3) (envelope-from ) id 1j89r0-0008R0-6l for pgsql-sql@lists.postgresql.org; Sat, 29 Feb 2020 21:40:58 +0000 Date: Sat, 29 Feb 2020 21:40:58 +0000 From: Wayne To: pgsql-sql@lists.postgresql.org Subject: Re: min()/max() with BRIN indexes Message-ID: <20200229214058.GE20190@ln-1.useunix.net> Mail-Followup-To: pgsql-sql@lists.postgresql.org References: <20200229165024.GD20190@ln-1.useunix.net> <16370.1583005035@sss.pgh.pa.us> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <16370.1583005035@sss.pgh.pa.us> User-Agent: Mutt/1.10.1 (2018-07-13) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk On Sat, Feb 29, 2020 at 02:37:15PM -0500, Tom Lane wrote: > Wayne writes: > > I have rather large tables that use a time stamp as an index. New entries > > are continuously added to the table with the current time. If I convert > > from BTREE to BRIN indexes and select records with specific date ranges > > the BRIN is used and performance is acceptable. However I often want to > > get the latest time stamp using the max() function. I didn't expect that > > this would result in a sequential scan of the table and skip the BRIN > > index. > > > Is this expected behavior? > > Yeah. In principle a BRIN index could be used to accelerate finding min > or max, but there's no actual support for that at the moment ... and in > any case, it'd still be substantially slower than the equivalent with > a btree index, which can locate the extremal values immediately. > > For this particular case, you might be able to fake it with something like > > select max(ts) from mytab where ts > 'some cutoff' > > if you can estimate some not-too-far-before-current-time cutoff > that you are sure you'll find some records after. > > regards, tom lane > Thanks Tom, I kind of "discovered" the 'some cutoff' trick prior to my posting but neglected to mention it as I couldn't figure out why it worked but max(ts) by itself wouldn't. Agreed, it would be substantially slower than a btree index but much faster than a seq scan of the table. In this use case they are monthly tables typically >= 130gig. The btree index is typically >20 gig while the corresponding brin is ~ 2meg. For all other use cases on these tables the brin index is a great space vs performance compromise. For now I can get by with the 'some cutoff' estimate but I hope adding min()/max() to brin indexes on the wish list. Thanks again, Wayne