Hello, > Parallel version is not supported, but I think it should be possible.
@Tomas are you working on this ? If not, I would like to give it a try. > static void > AssertCheckRanges(BrinSortState *node) > { > #ifdef USE_ASSERT_CHECKING > > #endif > } I guess it should not be empty at the ongoing development stage. Attached a small modification of the patch with a draft of the docs. Regards, Sergey Dudoladov
From d4050be4bfd0a518eba0ff0a7b561f0420be9861 Mon Sep 17 00:00:00 2001 From: Sergey Dudoladov <sergey.dudola...@gmail.com> Date: Wed, 2 Aug 2023 16:47:35 +0200 Subject: [PATCH] BRIN sort: add docs / fix typos --- doc/src/sgml/brin.sgml | 48 +++++++++++++++++++++++++++++ src/backend/executor/nodeBrinSort.c | 9 +++--- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/doc/src/sgml/brin.sgml b/doc/src/sgml/brin.sgml index 9c5ffcddf8..a76f26e032 100644 --- a/doc/src/sgml/brin.sgml +++ b/doc/src/sgml/brin.sgml @@ -810,6 +810,54 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was </sect1> +<sect1 id="brin-sort"> + <title>BRIN Sort</title> + + <para> + This section provides an overview of <acronym>BRIN</acronym> sort that may be + useful to advanced users. See <filename>src/backend/executor/nodeBrinSort.c</filename> + in the source distribution for the implementation. + </para> + + <sect2 id="brin-sort-overview"> + <title>Overview</title> + <para> + The information about ranges in a <acronym>BRIN</acronym> index can be used + to split a table into parts and sort each part separately. A <acronym>BRIN</acronym> + sort is an index scan that uses the idea to incrementally sort the data. On + large tables <acronym>BRIN</acronym> index scan bridges the performance gap + between having a large B-tree index that supports ordered retrieval, and having + no index at all. + </para> + </sect2> + + <sect2 id="brin-sort-implementation"> + <title>Implementation</title> + <para> + + <acronym>BRIN</acronym> sort fetches a list of page ranges from the <acronym>BRIN</acronym> + index and sorts them by their summary info depending on the operator class and + sort direction. It then determines the watermark: the next summary value from + the list. Tuples with summary values less than the watermark are sorted and + outputted directly; tuples with values greater than the watermark are spilled + into the next iteration. The process continues until either all ranges are + processed or the desired number of tuples has been retrieved. + </para> + </sect2> + + <sect2 id="brin-sort-limitations"> + <title>Limitations</title> + <para> + The performance of the <acronym>BRIN</acronym> sort depends on the degree of + correlation between the values of the indexed column and their physical location + on disk: in the case of high correlation, there will be few overlapping ranges, + and performance will be best. Another limitation is that <acronym>BRIN</acronym> + sort only works for indexes built on a single column. + </para> + </sect2> + +</sect1> + <sect1 id="brin-extensibility"> <title>Extensibility</title> diff --git a/src/backend/executor/nodeBrinSort.c b/src/backend/executor/nodeBrinSort.c index d1b6b4e1ed..c640aea2d5 100644 --- a/src/backend/executor/nodeBrinSort.c +++ b/src/backend/executor/nodeBrinSort.c @@ -731,8 +731,9 @@ brinsort_load_spill_tuples(BrinSortState *node, bool check_watermark) static bool brinsort_next_range(BrinSortState *node, bool asc) { - /* FIXME free the current bs_range, if any */ - node->bs_range = NULL; + /* free the current bs_range, if any */ + if (node->bs_range != NULL) + pfree(node->bs_range); /* * Mark the position, so that we can restore it in case we reach the @@ -1227,7 +1228,7 @@ IndexNext(BrinSortState *node) case BRINSORT_PROCESS_RANGE: - elog(DEBUG1, "phase BRINSORT_PROCESS_RANGE"); + elog(DEBUG1, "phase = BRINSORT_PROCESS_RANGE"); slot = node->ss.ps.ps_ResultTupleSlot; @@ -1263,7 +1264,7 @@ IndexNext(BrinSortState *node) } else { - /* updte the watermark and try reading more ranges */ + /* update the watermark and try reading more ranges */ node->bs_phase = BRINSORT_LOAD_RANGE; brinsort_update_watermark(node, false, asc); } -- 2.34.1