pg.ddx.io  pgsql-hackers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Tomas Vondra <tomas.vondra@2ndquadrant.com>
To: Mark Dilger <hornschnorter@gmail.com>
Cc: pgsql-hackers@postgreSQL.org
Subject: Re: WIP: BRIN multi-range indexes
Date: Sun, 7 Jan 2018 17:13:55 +0100
Message-ID: <f9a4548b-8f62-4d2d-137e-8efe36800f35@2ndquadrant.com> (raw)
In-Reply-To: <D06552D7-E144-47E1-B053-4934A820D417@gmail.com>
References: <c1138ead-7668-f0e1-0638-c3be3237e812@2ndquadrant.com>
	<7899d6e3-7f30-6de1-d341-0670fc1aff42@2ndquadrant.com>
	<edbce0ff-f5b1-c381-2649-3ac174eb7ca6@2ndquadrant.com>
	<0577af5d-28ae-3df5-dffd-fc630d681ec2@2ndquadrant.com>
	<AF96CF9E-DEF8-466D-A8BA-FBFD7914B526@gmail.com>
	<d2e68c24-1982-c46c-4580-3e392bad7907@2ndquadrant.com>
	<D06552D7-E144-47E1-B053-4934A820D417@gmail.com>



On 12/20/2017 03:37 AM, Mark Dilger wrote:
> 
>> On Dec 19, 2017, at 5:16 PM, Tomas Vondra <tomas.vondra@2ndquadrant.com> wrote:
>>
>>
>>
>> On 12/19/2017 08:38 PM, Mark Dilger wrote:
>>>
>>>> On Nov 18, 2017, at 12:45 PM, Tomas Vondra <tomas.vondra@2ndquadrant.com> wrote:
>>>>
>>>> Hi,
>>>>
>>>> Apparently there was some minor breakage due to duplicate OIDs, so here
>>>> is the patch series updated to current master.
>>>>
>>>> regards
>>>>
>>>> -- 
>>>> Tomas Vondra                  http://www.2ndQuadrant.com
>>>> PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
>>>> <0001-Pass-all-keys-to-BRIN-consistent-function-at-once.patch.gz><0002-BRIN-bloom-indexes.patch.gz><0003-BRIN-multi-range-minmax-indexes.patch.gz><0004-Move-IS-NOT-NULL-checks-to-bringetbitmap.patch.gz>
>>>
>>>
>>> After applying these four patches to my copy of master, the regression
>>> tests fail for F_SATISFIES_HASH_PARTITION 5028 as attached.
>>>
>>
>> D'oh! There was an incorrect OID referenced in pg_opclass, which was
>> also used by the satisfies_hash_partition() function. Fixed patches
>> attached.
> 
> Your use of type ScanKey in src/backend/access/brin/brin.c is a bit confusing.  A
> ScanKey is defined elsewhere as a pointer to ScanKeyData.  When you define
> an array of ScanKeys, you use pointer-to-pointer style:
> 
> +   ScanKey   **keys,
> +              **nullkeys;
> 
> But when you allocate space for the array, you don't treat it that way:
> 
> +   keys = palloc0(sizeof(ScanKey) * bdesc->bd_tupdesc->natts);
> +   nullkeys = palloc0(sizeof(ScanKey) * bdesc->bd_tupdesc->natts);
> 
> But then again when you use nullkeys, you treat it as a two-dimensional array:
> 
> +   nullkeys[keyattno - 1][nnullkeys[keyattno - 1]] = key;
> 
> and likewise when you allocate space within keys:
> 
> +    keys[keyattno - 1] = palloc0(sizeof(ScanKey) * scan->numberOfKeys);
> 
> Could you please clarify?  I have been awake a bit too long; hopefully, I am
> not merely missing the obvious.
> 

Yeah, that's wrong - it should be "sizeof(ScanKey *)" instead. It's
harmless, though, because ScanKey itself is a pointer, so the size is
the same.

Attached is an updated version of the patch series, significantly
reworking and improving the multi-minmax part (the rest of the patch is
mostly as it was before).

I've significantly refactored and cleaned up the multi-minmax part, and
I'm much happier with it - no doubt there's room for further improvement
but overall it's much better.

I've also added proper sgml docs for this part, and support for more
data types including variable-length ones (all integer types, numeric,
float-based types including timestamps, uuid, and a couple of others).

At the API level, I needed to add one extra support procedure that
measures distance between two values of the data type. This is needed so
because we only keep a limited number of intervals for each range, and
once in a while we need to decide which of them to "merge" (and we
simply merge the closest ones).

I've passed the indexes through significant testing and fixed a couple
of silly bugs / memory leaks. Let's see if there are more.

Performance-wise, the CREATE INDEX seems a bit slow - it's about an
order of magnitude slower than regular BRIN. Some of that is expected
(we simply need to do more stuff to maintain multiple ranges), but
perhaps there's room for additional improvements - that's something I'd
like to work on next.

regards

-- 
Tomas Vondra                  http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

  [application/gzip] 0001-Pass-all-keys-to-BRIN-consistent-function-at-once.patch.gz (5.4K, ../f9a4548b-8f62-4d2d-137e-8efe36800f35@2ndquadrant.com/2-0001-Pass-all-keys-to-BRIN-consistent-function-at-once.patch.gz)
  download

  [application/gzip] 0002-BRIN-bloom-indexes.patch.gz (14.4K, ../f9a4548b-8f62-4d2d-137e-8efe36800f35@2ndquadrant.com/3-0002-BRIN-bloom-indexes.patch.gz)
  download

  [application/gzip] 0003-BRIN-multi-range-minmax-indexes.patch.gz (20.9K, ../f9a4548b-8f62-4d2d-137e-8efe36800f35@2ndquadrant.com/4-0003-BRIN-multi-range-minmax-indexes.patch.gz)
  download

  [application/gzip] 0004-Move-IS-NOT-NULL-checks-to-bringetbitmap.patch.gz (3.3K, ../f9a4548b-8f62-4d2d-137e-8efe36800f35@2ndquadrant.com/5-0004-Move-IS-NOT-NULL-checks-to-bringetbitmap.patch.gz)
  download

view thread (177+ messages)  latest in thread

Message-ID: <f9a4548b-8f62-4d2d-137e-8efe36800f35@2ndquadrant.com>
Permalink:  ../f9a4548b-8f62-4d2d-137e-8efe36800f35@2ndquadrant.com/
Also on:    postgresql.org/message-id/f9a4548b-8f62-4d2d-137e-8efe36800f35@2ndquadrant.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-hackers@postgresql.org
  Cc: tomas.vondra@2ndquadrant.com, hornschnorter@gmail.com
  Subject: Re: WIP: BRIN multi-range indexes
  In-Reply-To: <f9a4548b-8f62-4d2d-137e-8efe36800f35@2ndquadrant.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox