[PATCH] Incremental sort (was: PoC: Partial sort)

Started by Alexander Korotkovabout 9 years ago359 messageshackers
Jump to latest
#1Alexander Korotkov
aekorotkov@gmail.com

Hi all!

I decided to start new thread for this patch for following two reasons.
* It's renamed from "Partial sort" to "Incremental sort" per suggestion by
Robert Haas [1]. New name much better characterizes the essence of
algorithm.
* I think it's not PoC anymore. Patch received several rounds of review
and now it's in the pretty good shape.

Attached revision of patch has following changes.
* According to review [1], two new path and plan nodes are responsible for
incremental sort: IncSortPath and IncSort which are inherited from SortPath
and Sort correspondingly. That allowed to get rid of set of hacks with
minimal code changes.
* According to review [1] and comment [2], previous tuple is stored in
standalone tuple slot of SortState rather than just HeapTuple.
* New GUC parameter enable_incsort is introduced to control planner
ability to choose incremental sort.
* Test of postgres_fdw with not pushed down cross join is corrected. It
appeared that with incremental sort such query is profitable to push down.
I changed ORDER BY columns so that index couldn't be used. I think this
solution is more elegant than setting enable_incsort = off.

Also patch has set of assorted code and comments improvements.

Links
1.
/messages/by-id/CA+TgmoZapyHRm7NVyuyZ+yAV=U1a070BOgRe7PkgyrAegR4JDA@mail.gmail.com
2.
/messages/by-id/CAM3SWZQL4yD2SnDheMCGL0Q2b2oTdKUvv_L6Zg_FcGoLuwMffg@mail.gmail.com

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

incremental-sort-1.patchapplication/octet-stream; name=incremental-sort-1.patchDownload+1272-689
#2Robert Haas
robertmhaas@gmail.com
In reply to: Alexander Korotkov (#1)
Re: [PATCH] Incremental sort (was: PoC: Partial sort)

On Sat, Feb 18, 2017 at 4:01 PM, Alexander Korotkov
<a.korotkov@postgrespro.ru> wrote:

I decided to start new thread for this patch for following two reasons.
* It's renamed from "Partial sort" to "Incremental sort" per suggestion by
Robert Haas [1]. New name much better characterizes the essence of
algorithm.
* I think it's not PoC anymore. Patch received several rounds of review
and now it's in the pretty good shape.

Attached revision of patch has following changes.
* According to review [1], two new path and plan nodes are responsible for
incremental sort: IncSortPath and IncSort which are inherited from SortPath
and Sort correspondingly. That allowed to get rid of set of hacks with
minimal code changes.
* According to review [1] and comment [2], previous tuple is stored in
standalone tuple slot of SortState rather than just HeapTuple.
* New GUC parameter enable_incsort is introduced to control planner ability
to choose incremental sort.
* Test of postgres_fdw with not pushed down cross join is corrected. It
appeared that with incremental sort such query is profitable to push down.
I changed ORDER BY columns so that index couldn't be used. I think this
solution is more elegant than setting enable_incsort = off.

I usually advocate for spelling things out instead of abbreviating, so
I guess I'll stay true to form here and suggest that abbreviating
incremental to inc doesn't seem like a great idea. Is that sort
incrementing, incremental, incredible, incautious, or incorporated?

The first hunk in the patch, a change in the postgres_fdw regression
test output, looks an awful lot like a bug: now the query that
formerly returned various different numbers is returning all zeroes.
It might not actually be a bug, because you've also changed the test
query (not sure why), but anyway the new regression test output that
is all zeroes seems less useful for catching bugs in, say, the
ordering of the results than the old output where the different rows
were different.

I don't know of any existing cases where the same executor file is
responsible for executing more than 1 different type of executor node.
I was imagining a more-complete separation of the new executor node.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Alexander Korotkov
aekorotkov@gmail.com
In reply to: Robert Haas (#2)
Re: [PATCH] Incremental sort (was: PoC: Partial sort)

On Sun, Feb 19, 2017 at 2:18 PM, Robert Haas <robertmhaas@gmail.com> wrote:

On Sat, Feb 18, 2017 at 4:01 PM, Alexander Korotkov
<a.korotkov@postgrespro.ru> wrote:

I decided to start new thread for this patch for following two reasons.
* It's renamed from "Partial sort" to "Incremental sort" per suggestion

by

Robert Haas [1]. New name much better characterizes the essence of
algorithm.
* I think it's not PoC anymore. Patch received several rounds of review
and now it's in the pretty good shape.

Attached revision of patch has following changes.
* According to review [1], two new path and plan nodes are responsible

for

incremental sort: IncSortPath and IncSort which are inherited from

SortPath

and Sort correspondingly. That allowed to get rid of set of hacks with
minimal code changes.
* According to review [1] and comment [2], previous tuple is stored in
standalone tuple slot of SortState rather than just HeapTuple.
* New GUC parameter enable_incsort is introduced to control planner

ability

to choose incremental sort.
* Test of postgres_fdw with not pushed down cross join is corrected. It
appeared that with incremental sort such query is profitable to push

down.

I changed ORDER BY columns so that index couldn't be used. I think this
solution is more elegant than setting enable_incsort = off.

I usually advocate for spelling things out instead of abbreviating, so
I guess I'll stay true to form here and suggest that abbreviating
incremental to inc doesn't seem like a great idea. Is that sort
incrementing, incremental, incredible, incautious, or incorporated?

I'm not that sure about naming of GUCs, because we already
have enable_hashagg instead of enable_hashaggregate, enable_material
instead of enable_materialize, enable_nestloop instead
of enable_nestedloop. But anyway I renamed "inc" to "Incremental"
everywhere in the code. I renamed enable_incsort GUC into
enable_incrementalsort as well, because I don't have strong opinion here.

The first hunk in the patch, a change in the postgres_fdw regression

test output, looks an awful lot like a bug: now the query that
formerly returned various different numbers is returning all zeroes.
It might not actually be a bug, because you've also changed the test
query (not sure why), but anyway the new regression test output that
is all zeroes seems less useful for catching bugs in, say, the
ordering of the results than the old output where the different rows
were different.

Yes, I've changed regression test query as I mentioned in the previous
message. With incremental sort feature original query can't serve anymore
as an example of non-pushdown join. However, you're right that query which
returns all zeroes doesn't look good there either. So, I changed that
query to ordering by column "c3" which is actually non-indexed textual
representation of "c1".

I don't know of any existing cases where the same executor file is
responsible for executing more than 1 different type of executor node.
I was imagining a more-complete separation of the new executor node.

Ok, I put incremental sort into separate executor node.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

incremental-sort-2.patchapplication/octet-stream; name=incremental-sort-2.patchDownload+1570-605
#4Mithun Cy
mithun.cy@enterprisedb.com
In reply to: Alexander Korotkov (#3)
Re: [PATCH] Incremental sort (was: PoC: Partial sort)

On Mon, Feb 27, 2017 at 8:29 PM, Alexander Korotkov
<a.korotkov@postgrespro.ru> wrote:

This patch needs to be rebased.

1. It fails while applying as below

patching file src/test/regress/expected/sysviews.out
Hunk #1 FAILED at 70.
1 out of 1 hunk FAILED -- saving rejects to file
src/test/regress/expected/sysviews.out.rej
patching file src/test/regress/sql/inherit.sql

2. Also, there are compilation errors due to new commits.

-fwrapv -fexcess-precision=standard -O2 -I../../../../src/include
-D_GNU_SOURCE -c -o createplan.o createplan.c
createplan.c: In function ‘create_gather_merge_plan’:
createplan.c:1510:11: warning: passing argument 3 of ‘make_sort’ makes
integer from pointer without a cast [enabled by default]
gm_plan->nullsFirst);
^
createplan.c:235:14: note: expected ‘int’ but argument is of type ‘AttrNumber *’
static Sort *make_sort(Plan *lefttree, int numCols, int skipCols,
^
createplan.c:1510:11: warning: passing argument 4 of ‘make_sort’ from
incompatible pointer type [enabled by default]
gm_plan->nullsFirst);

--
Thanks and Regards
Mithun C Y
EnterpriseDB: http://www.enterprisedb.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#5Alexander Korotkov
aekorotkov@gmail.com
In reply to: Mithun Cy (#4)
Re: [PATCH] Incremental sort (was: PoC: Partial sort)

Dear Mithun,

On Mon, Mar 20, 2017 at 10:01 AM, Mithun Cy <mithun.cy@enterprisedb.com>
wrote:

On Mon, Feb 27, 2017 at 8:29 PM, Alexander Korotkov
<a.korotkov@postgrespro.ru> wrote:

This patch needs to be rebased.

1. It fails while applying as below

patching file src/test/regress/expected/sysviews.out
Hunk #1 FAILED at 70.
1 out of 1 hunk FAILED -- saving rejects to file
src/test/regress/expected/sysviews.out.rej
patching file src/test/regress/sql/inherit.sql

2. Also, there are compilation errors due to new commits.

-fwrapv -fexcess-precision=standard -O2 -I../../../../src/include
-D_GNU_SOURCE -c -o createplan.o createplan.c
createplan.c: In function ‘create_gather_merge_plan’:
createplan.c:1510:11: warning: passing argument 3 of ‘make_sort’ makes
integer from pointer without a cast [enabled by default]
gm_plan->nullsFirst);
^
createplan.c:235:14: note: expected ‘int’ but argument is of type
‘AttrNumber *’
static Sort *make_sort(Plan *lefttree, int numCols, int skipCols,
^
createplan.c:1510:11: warning: passing argument 4 of ‘make_sort’ from
incompatible pointer type [enabled by default]
gm_plan->nullsFirst);

Thank you for the report.
Please, find rebased patch in the attachment.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

incremental-sort-3.patchapplication/octet-stream; name=incremental-sort-3.patchDownload+1586-615
#6Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Alexander Korotkov (#5)
Re: [PATCH] Incremental sort

On 03/20/2017 11:33 AM, Alexander Korotkov wrote:

Please, find rebased patch in the attachment.

I had a quick look at this.

* I'd love to have an explanation of what an Incremental Sort is, in the
file header comment for nodeIncrementalSort.c.

* I didn't understand the maxMem stuff in tuplesort.c. The comments
there use the phrase "on-disk memory", which seems like an oxymoron.
Also, "maximum status" seems weird, as it assumes that there's a natural
order to the states.

* In the below example, the incremental sort is significantly slower
than the Seq Scan + Sort you get otherwise:

create table foo (a int4, b int4, c int4);
insert into sorttest select g, g, g from generate_series(1, 1000000) g;
vacuum foo;
create index i_sorttest on sorttest (a, b, c);
set work_mem='100MB';

postgres=# explain select count(*) from (select * from sorttest order by
a, c) as t;
QUERY PLAN

-------------------------------------------------------------------------------------------------------
Aggregate (cost=138655.68..138655.69 rows=1 width=8)
-> Incremental Sort (cost=610.99..124870.38 rows=1102824 width=12)
Sort Key: sorttest.a, sorttest.c
Presorted Key: sorttest.a
-> Index Only Scan using i_sorttest on sorttest
(cost=0.43..53578.79 rows=1102824 width=12)
(5 rows)

Time: 0.409 ms
postgres=# select count(*) from (select * from sorttest order by a, c) as t;
count
---------
1000000
(1 row)

Time: 387.091 ms

postgres=# explain select count(*) from (select * from sorttest order by
a, c) as t;
QUERY PLAN

-------------------------------------------------------------------------------
Aggregate (cost=130063.84..130063.85 rows=1 width=8)
-> Sort (cost=115063.84..117563.84 rows=1000000 width=12)
Sort Key: sorttest.a, sorttest.c
-> Seq Scan on sorttest (cost=0.00..15406.00 rows=1000000
width=12)
(4 rows)

Time: 0.345 ms
postgres=# select count(*) from (select * from sorttest order by a, c) as t;
count
---------
1000000
(1 row)

Time: 231.668 ms

According to 'perf', 85% of the CPU time is spent in ExecCopySlot(). To
alleviate that, it might be worthwhile to add a special case for when
the group contains exactly one group, and not put the tuple to the
tuplesort in that case. Or if we cannot ensure that the Incremental Sort
is actually faster, the cost model should probably be smarter, to avoid
picking an incremental sort when it's not a win.

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#7David Steele
david@pgmasters.net
In reply to: Heikki Linnakangas (#6)
Re: [PATCH] Incremental sort

Hi Alexander,

On 3/20/17 10:19 AM, Heikki Linnakangas wrote:

On 03/20/2017 11:33 AM, Alexander Korotkov wrote:

Please, find rebased patch in the attachment.

I had a quick look at this.

<...>

According to 'perf', 85% of the CPU time is spent in ExecCopySlot(). To
alleviate that, it might be worthwhile to add a special case for when
the group contains exactly one group, and not put the tuple to the
tuplesort in that case. Or if we cannot ensure that the Incremental Sort
is actually faster, the cost model should probably be smarter, to avoid
picking an incremental sort when it's not a win.

This thread has been idle for over a week. Please respond with a new
patch by 2017-03-30 00:00 AoE (UTC-12) or this submission will be marked
"Returned with Feedback".

--
-David
david@pgmasters.net

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#8Alexander Korotkov
aekorotkov@gmail.com
In reply to: David Steele (#7)
Re: [PATCH] Incremental sort

On Tue, Mar 28, 2017 at 5:27 PM, David Steele <david@pgmasters.net> wrote:

Hi Alexander,

On 3/20/17 10:19 AM, Heikki Linnakangas wrote:

On 03/20/2017 11:33 AM, Alexander Korotkov wrote:

Please, find rebased patch in the attachment.

I had a quick look at this.

<...>

According to 'perf', 85% of the CPU time is spent in ExecCopySlot(). To

alleviate that, it might be worthwhile to add a special case for when
the group contains exactly one group, and not put the tuple to the
tuplesort in that case. Or if we cannot ensure that the Incremental Sort
is actually faster, the cost model should probably be smarter, to avoid
picking an incremental sort when it's not a win.

This thread has been idle for over a week. Please respond with a new
patch by 2017-03-30 00:00 AoE (UTC-12) or this submission will be marked
"Returned with Feedback".

Thank you for reminder!

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#9Alexander Korotkov
aekorotkov@gmail.com
In reply to: Heikki Linnakangas (#6)
Re: [PATCH] Incremental sort

On Mon, Mar 20, 2017 at 5:19 PM, Heikki Linnakangas <hlinnaka@iki.fi> wrote:

On 03/20/2017 11:33 AM, Alexander Korotkov wrote:

Please, find rebased patch in the attachment.

I had a quick look at this.

* I'd love to have an explanation of what an Incremental Sort is, in the
file header comment for nodeIncrementalSort.c.

Done.

* I didn't understand the maxMem stuff in tuplesort.c. The comments there

use the phrase "on-disk memory", which seems like an oxymoron. Also,
"maximum status" seems weird, as it assumes that there's a natural order to
the states.

Variables were renamed.

* In the below example, the incremental sort is significantly slower than

the Seq Scan + Sort you get otherwise:

create table foo (a int4, b int4, c int4);
insert into sorttest select g, g, g from generate_series(1, 1000000) g;
vacuum foo;
create index i_sorttest on sorttest (a, b, c);
set work_mem='100MB';

postgres=# explain select count(*) from (select * from sorttest order by
a, c) as t;
QUERY PLAN
------------------------------------------------------------
-------------------------------------------
Aggregate (cost=138655.68..138655.69 rows=1 width=8)
-> Incremental Sort (cost=610.99..124870.38 rows=1102824 width=12)
Sort Key: sorttest.a, sorttest.c
Presorted Key: sorttest.a
-> Index Only Scan using i_sorttest on sorttest
(cost=0.43..53578.79 rows=1102824 width=12)
(5 rows)

Time: 0.409 ms
postgres=# select count(*) from (select * from sorttest order by a, c) as
t;
count
---------
1000000
(1 row)

Time: 387.091 ms

postgres=# explain select count(*) from (select * from sorttest order by
a, c) as t;
QUERY PLAN
------------------------------------------------------------
-------------------
Aggregate (cost=130063.84..130063.85 rows=1 width=8)
-> Sort (cost=115063.84..117563.84 rows=1000000 width=12)
Sort Key: sorttest.a, sorttest.c
-> Seq Scan on sorttest (cost=0.00..15406.00 rows=1000000
width=12)
(4 rows)

Time: 0.345 ms
postgres=# select count(*) from (select * from sorttest order by a, c) as
t;
count
---------
1000000
(1 row)

Time: 231.668 ms

According to 'perf', 85% of the CPU time is spent in ExecCopySlot(). To
alleviate that, it might be worthwhile to add a special case for when the
group contains exactly one group, and not put the tuple to the tuplesort in
that case.

I'm not sure we should do such optimization for one tuple per group, since
it's similar situation with 2 or 3 tuples per group.

Or if we cannot ensure that the Incremental Sort is actually faster, the
cost model should probably be smarter, to avoid picking an incremental sort
when it's not a win.

I added to cost_sort() extra costing for incremental sort: cost of extra
tuple copying and comparing as well as cost of tuplesort reset.
The only problem is that I made following estimate for tuplesort reset:

run_cost += 10.0 * cpu_tuple_cost * num_groups;

It makes ordinal sort to be selected in your example, but it contains
constant 10 which is quite arbitrary. It would be nice to evade such hard
coded constants, but I don't know how could we calculate such cost
realistically.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

incremental-sort-4.patchapplication/octet-stream; name=incremental-sort-4.patchDownload+1633-605
#10Andres Freund
andres@anarazel.de
In reply to: Alexander Korotkov (#8)
Re: [PATCH] Incremental sort

On 2017-03-29 00:17:02 +0300, Alexander Korotkov wrote:

On Tue, Mar 28, 2017 at 5:27 PM, David Steele <david@pgmasters.net> wrote:

Hi Alexander,

On 3/20/17 10:19 AM, Heikki Linnakangas wrote:

On 03/20/2017 11:33 AM, Alexander Korotkov wrote:

Please, find rebased patch in the attachment.

I had a quick look at this.

<...>

According to 'perf', 85% of the CPU time is spent in ExecCopySlot(). To

alleviate that, it might be worthwhile to add a special case for when
the group contains exactly one group, and not put the tuple to the
tuplesort in that case. Or if we cannot ensure that the Incremental Sort
is actually faster, the cost model should probably be smarter, to avoid
picking an incremental sort when it's not a win.

This thread has been idle for over a week. Please respond with a new
patch by 2017-03-30 00:00 AoE (UTC-12) or this submission will be marked
"Returned with Feedback".

Thank you for reminder!

I've just done so. Please resubmit once updated, it's a cool feature.

- Andres

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#11Alexander Korotkov
aekorotkov@gmail.com
In reply to: Andres Freund (#10)
Re: [PATCH] Incremental sort

On Mon, Apr 3, 2017 at 9:34 PM, Andres Freund <andres@anarazel.de> wrote:

On 2017-03-29 00:17:02 +0300, Alexander Korotkov wrote:

On Tue, Mar 28, 2017 at 5:27 PM, David Steele <david@pgmasters.net>

wrote:

On 3/20/17 10:19 AM, Heikki Linnakangas wrote:

On 03/20/2017 11:33 AM, Alexander Korotkov wrote:

Please, find rebased patch in the attachment.

I had a quick look at this.

<...>

According to 'perf', 85% of the CPU time is spent in ExecCopySlot(). To

alleviate that, it might be worthwhile to add a special case for when
the group contains exactly one group, and not put the tuple to the
tuplesort in that case. Or if we cannot ensure that the Incremental

Sort

is actually faster, the cost model should probably be smarter, to

avoid

picking an incremental sort when it's not a win.

This thread has been idle for over a week. Please respond with a new
patch by 2017-03-30 00:00 AoE (UTC-12) or this submission will be

marked

"Returned with Feedback".

Thank you for reminder!

I've just done so. Please resubmit once updated, it's a cool feature.

Thank you!
I already sent version of patch after David's reminder.
Please find rebased patch in the attachment.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

incremental-sort-5.patchapplication/octet-stream; name=incremental-sort-5.patchDownload+1632-604
#12Andres Freund
andres@anarazel.de
In reply to: Alexander Korotkov (#11)
Re: [PATCH] Incremental sort

On April 3, 2017 12:03:56 PM PDT, Alexander Korotkov <a.korotkov@postgrespro.ru> wrote:

On Mon, Apr 3, 2017 at 9:34 PM, Andres Freund <andres@anarazel.de>
wrote:

On 2017-03-29 00:17:02 +0300, Alexander Korotkov wrote:

On Tue, Mar 28, 2017 at 5:27 PM, David Steele <david@pgmasters.net>

wrote:

On 3/20/17 10:19 AM, Heikki Linnakangas wrote:

On 03/20/2017 11:33 AM, Alexander Korotkov wrote:

Please, find rebased patch in the attachment.

I had a quick look at this.

<...>

According to 'perf', 85% of the CPU time is spent in

ExecCopySlot(). To

alleviate that, it might be worthwhile to add a special case for

when

the group contains exactly one group, and not put the tuple to

the

tuplesort in that case. Or if we cannot ensure that the

Incremental

Sort

is actually faster, the cost model should probably be smarter,

to

avoid

picking an incremental sort when it's not a win.

This thread has been idle for over a week. Please respond with a

new

patch by 2017-03-30 00:00 AoE (UTC-12) or this submission will be

marked

"Returned with Feedback".

Thank you for reminder!

I've just done so. Please resubmit once updated, it's a cool

feature.

Thank you!
I already sent version of patch after David's reminder.
Please find rebased patch in the attachment.

Cool. I think that's still a bit late for v10?

Andres
--
Sent from my Android device with K-9 Mail. Please excuse my brevity.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#13Alexander Korotkov
aekorotkov@gmail.com
In reply to: Andres Freund (#12)
Re: [PATCH] Incremental sort

On Mon, Apr 3, 2017 at 10:05 PM, Andres Freund <andres@anarazel.de> wrote:

On April 3, 2017 12:03:56 PM PDT, Alexander Korotkov <
a.korotkov@postgrespro.ru> wrote:

On Mon, Apr 3, 2017 at 9:34 PM, Andres Freund <andres@anarazel.de>
wrote:

On 2017-03-29 00:17:02 +0300, Alexander Korotkov wrote:

On Tue, Mar 28, 2017 at 5:27 PM, David Steele <david@pgmasters.net>

wrote:

On 3/20/17 10:19 AM, Heikki Linnakangas wrote:

On 03/20/2017 11:33 AM, Alexander Korotkov wrote:

Please, find rebased patch in the attachment.

I had a quick look at this.

<...>

According to 'perf', 85% of the CPU time is spent in

ExecCopySlot(). To

alleviate that, it might be worthwhile to add a special case for

when

the group contains exactly one group, and not put the tuple to

the

tuplesort in that case. Or if we cannot ensure that the

Incremental

Sort

is actually faster, the cost model should probably be smarter,

to

avoid

picking an incremental sort when it's not a win.

This thread has been idle for over a week. Please respond with a

new

patch by 2017-03-30 00:00 AoE (UTC-12) or this submission will be

marked

"Returned with Feedback".

Thank you for reminder!

I've just done so. Please resubmit once updated, it's a cool

feature.

Thank you!
I already sent version of patch after David's reminder.
Please find rebased patch in the attachment.

Cool. I think that's still a bit late for v10?

I don't know. ISTM, that I addressed all the issues raised by reviewers.
Also, this patch is pending since late 2013. It would be very nice to
finally get it in...

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#14Andres Freund
andres@anarazel.de
In reply to: Alexander Korotkov (#13)
Re: [PATCH] Incremental sort

Hi,

On 2017-04-04 00:04:09 +0300, Alexander Korotkov wrote:

Thank you!
I already sent version of patch after David's reminder.
Please find rebased patch in the attachment.

Cool. I think that's still a bit late for v10?

I don't know. ISTM, that I addressed all the issues raised by reviewers.
Also, this patch is pending since late 2013. It would be very nice to
finally get it in...

To me this hasn't gotten even remotely enough performance evaluation.
And I don't think it's fair to characterize it as pending since 2013,
given it was essentially "waiting on author" for most of that.

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#15Alexander Korotkov
aekorotkov@gmail.com
In reply to: Andres Freund (#14)
Re: [PATCH] Incremental sort

On Tue, Apr 4, 2017 at 12:09 AM, Andres Freund <andres@anarazel.de> wrote:

On 2017-04-04 00:04:09 +0300, Alexander Korotkov wrote:

Thank you!
I already sent version of patch after David's reminder.
Please find rebased patch in the attachment.

Cool. I think that's still a bit late for v10?

I don't know. ISTM, that I addressed all the issues raised by reviewers.
Also, this patch is pending since late 2013. It would be very nice to
finally get it in...

To me this hasn't gotten even remotely enough performance evaluation.

I'm ready to put my efforts on that.

And I don't think it's fair to characterize it as pending since 2013,

Probably, this duration isn't good characteristic at all.

given it was essentially "waiting on author" for most of that.

What makes you think so? Do you have some statistics? Or is it just
random assumption?

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#16Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#14)
Re: [PATCH] Incremental sort

On Mon, Apr 3, 2017 at 5:09 PM, Andres Freund <andres@anarazel.de> wrote:

To me this hasn't gotten even remotely enough performance evaluation.
And I don't think it's fair to characterize it as pending since 2013,
given it was essentially "waiting on author" for most of that.

This is undeniably a patch which has been kicking around for a lot of
time without getting a lot of attention, and if it just keeps getting
punted down the road, it's never going to become committable.
Alexander's questions upthread about what decisions the committer who
took an interest (Heikki) would prefer never really got an answer, for
example. I don't deny that there may be some work left to do here,
but I think blaming the author for a week's delay when this has been
ignored so often for so long is unfair.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#17Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#16)
Re: [PATCH] Incremental sort

On 2017-04-03 22:18:21 -0400, Robert Haas wrote:

On Mon, Apr 3, 2017 at 5:09 PM, Andres Freund <andres@anarazel.de> wrote:

To me this hasn't gotten even remotely enough performance evaluation.
And I don't think it's fair to characterize it as pending since 2013,
given it was essentially "waiting on author" for most of that.

This is undeniably a patch which has been kicking around for a lot of
time without getting a lot of attention, and if it just keeps getting
punted down the road, it's never going to become committable.

Indeed, it's old. And it hasn't gotten enough timely feedback.

But I don't think the wait time can meaningfully be measured by
subtracting two dates:
The first version of the patch, as a PoC, has been posted 2013-12-14,
which then got a good amount of feedback & revisions, and then stalled
till 2014-07-12. There a few back-and forths yielded a new version.
From 2014-09-15 till 2015-10-16 the patch stalled, waiting on its
author. That version had open todos ([1]http://archives.postgresql.org/message-id/CAPpHfdvhwMsG69exCRUGK3ms-ng0PSPcucH5FU6tAaM-qL-1%2Bw%40mail.gmail.com), as had the version from
2016-03-13 [2]http://archives.postgresql.org/message-id/CAPpHfdvzjYGLTyA-8ib8UYnKLPrewd9Z%3DT4YJNCRWiHWHHweWw%40mail.gmail.com, which weren't addressed 2016-03-30 - unfortunately that
was pretty much when the tree was frozen. 2016-09-13 a rebased patch
was sent, some minor points were raised 2016-10-02 (unaddressed), a
larger review was done 2016-12-01 ([5]http://archives.postgresql.org/message-id/CA+TgmoZapyHRm7NVyuyZ+yAV=U1a070BOgRe7PkgyrAegR4JDA@mail.gmail.com), unaddressed till 2017-02-18.
At that point we're in this thread.

There's obviously some long waiting-on-author periods in there. And
some long needs-review periods.

Alexander's questions upthread about what decisions the committer who
took an interest (Heikki) would prefer never really got an answer, for
example. I don't deny that there may be some work left to do here,
but I think blaming the author for a week's delay when this has been
ignored so often for so long is unfair.

I'm not trying to blame Alexander for a week's worth of delay, at all.
It's just that, well, we're past the original code-freeze date, three
days before the "final" code freeze. I don't think fairness is something
we can achieve at this point :(. Given the risk of regressions -
demonstrated in this thread although partially adressed - and the very
limited amount of benchmarking done, it seems unlikely that this is
going to be merged.

Regards,

Andres

[1]: http://archives.postgresql.org/message-id/CAPpHfdvhwMsG69exCRUGK3ms-ng0PSPcucH5FU6tAaM-qL-1%2Bw%40mail.gmail.com
[2]: http://archives.postgresql.org/message-id/CAPpHfdvzjYGLTyA-8ib8UYnKLPrewd9Z%3DT4YJNCRWiHWHHweWw%40mail.gmail.com
[3]: http://archives.postgresql.org/message-id/CAPpHfdtCcHZ-mLWzsFrRCvHpV1LPSaOGooMZ3sa40AkwR=7ouQ@mail.gmail.com
[4]: http://archives.postgresql.org/message-id/CAPpHfdvj1Tdi2WA64ZbBp5-yG-uzaRXzk3K7J7zt-cRX6YSd0A@mail.gmail.com
[5]: http://archives.postgresql.org/message-id/CA+TgmoZapyHRm7NVyuyZ+yAV=U1a070BOgRe7PkgyrAegR4JDA@mail.gmail.com
[6]: http://archives.postgresql.org/message-id/CAPpHfds1waRZ=NOmueYq0sx1ZSCnt+5QJvizT8ndT2=etZEeAQ@mail.gmail.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#18Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#9)
Re: [PATCH] Incremental sort

On Wed, Mar 29, 2017 at 5:14 PM, Alexander Korotkov <
a.korotkov@postgrespro.ru> wrote:

I added to cost_sort() extra costing for incremental sort: cost of extra
tuple copying and comparing as well as cost of tuplesort reset.
The only problem is that I made following estimate for tuplesort reset:

run_cost += 10.0 * cpu_tuple_cost * num_groups;

It makes ordinal sort to be selected in your example, but it contains
constant 10 which is quite arbitrary. It would be nice to evade such hard
coded constants, but I don't know how could we calculate such cost
realistically.

That appears to be wrong. I intended to make cost_sort prefer plain sort
over incremental sort for this dataset size. But, that appears to be not
always right solution. Quick sort is so fast only on presorted data.
On my laptop I have following numbers for test case provided by Heikki.

Presorted data – very fast.

# explain select count(*) from (select * from sorttest order by a, c) as t;
QUERY PLAN
-------------------------------------------------------------------------------
Aggregate (cost=147154.34..147154.35 rows=1 width=8)
-> Sort (cost=132154.34..134654.34 rows=1000000 width=12)
Sort Key: sorttest.a, sorttest.c
-> Seq Scan on sorttest (cost=0.00..15406.00 rows=1000000
width=12)
(4 rows)

# select count(*) from (select * from sorttest order by a, c) as t;
count
---------
1000000
(1 row)

Time: 260,752 ms

Not presorted data – not so fast. It's actually slower than incremental
sort was.

# explain select count(*) from (select * from sorttest order by a desc, c
desc) as t;
QUERY PLAN
-------------------------------------------------------------------------------
Aggregate (cost=130063.84..130063.85 rows=1 width=8)
-> Sort (cost=115063.84..117563.84 rows=1000000 width=12)
Sort Key: sorttest.a DESC, sorttest.c DESC
-> Seq Scan on sorttest (cost=0.00..15406.00 rows=1000000
width=12)
(4 rows)

# select count(*) from (select * from sorttest order by a desc, c desc) as
t;
count
---------
1000000
(1 row)

Time: 416,207 ms

Thus, it would be nice to reflect the fact that our quicksort
implementation is very fast on presorted data. Fortunately, we have
corresponding statistics: STATISTIC_KIND_CORRELATION. However, it probably
should be a subject of a separate patch.

But I'd like to make incremental sort not slower than quicksort in case of
presorted data. New idea about it comes to my mind. Since cause of
incremental sort slowness in this case is too frequent reset of tuplesort,
then what if we would artificially put data in larger groups. Attached
revision of patch implements this: it doesn't stop to accumulate tuples to
tuplesort until we have MIN_GROUP_SIZE tuples.

# explain select count(*) from (select * from sorttest order by a, c) as t;
QUERY PLAN
-------------------------------------------------------------------------------------------------------
Aggregate (cost=85412.43..85412.43 rows=1 width=8)
-> Incremental Sort (cost=0.46..72912.43 rows=1000000 width=12)
Sort Key: sorttest.a, sorttest.c
Presorted Key: sorttest.a
-> Index Only Scan using i_sorttest on sorttest
(cost=0.42..30412.42 rows=1000000 width=12)
(5 rows)

# select count(*) from (select * from sorttest order by a, c) as t;
count
---------
1000000
(1 row)

Time: 251,227 ms

# explain select count(*) from (select * from sorttest order by a desc, c
desc) as t;
QUERY PLAN
────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Aggregate (cost=85412.43..85412.43 rows=1 width=8)
-> Incremental Sort (cost=0.46..72912.43 rows=1000000 width=12)
Sort Key: sorttest.a DESC, sorttest.c DESC
Presorted Key: sorttest.a
-> Index Only Scan Backward using i_sorttest on sorttest
(cost=0.42..30412.42 rows=1000000 width=12)
(5 rows)

# select count(*) from (select * from sorttest order by a desc, c desc) as
t;
count
---------
1000000
(1 row)

Time: 253,270 ms

Now, incremental sort is not slower than quicksort. And this seems to be
cool.
However, in the LIMIT case we will pay the price of fetching some extra
tuples from outer node. But, that doesn't seem to hurt us too much.

# explain select * from sorttest order by a, c limit 10;
QUERY PLAN
-------------------------------------------------------------------------------------------------------
Limit (cost=0.46..0.84 rows=10 width=12)
-> Incremental Sort (cost=0.46..37500.78 rows=1000000 width=12)
Sort Key: a, c
Presorted Key: a
-> Index Only Scan using i_sorttest on sorttest
(cost=0.42..30412.42 rows=1000000 width=12)
(5 rows)

# select * from sorttest order by a, c limit 10;
a | b | c
----+----+----
1 | 1 | 1
2 | 2 | 2
3 | 3 | 3
4 | 4 | 4
5 | 5 | 5
6 | 6 | 6
7 | 7 | 7
8 | 8 | 8
9 | 9 | 9
10 | 10 | 10
(10 rows)

Time: 0,903 ms

Any thoughts?

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

incremental-sort-6.patchapplication/octet-stream; name=incremental-sort-6.patchDownload+1651-604
In reply to: Alexander Korotkov (#18)
Re: [PATCH] Incremental sort

On Wed, Apr 26, 2017 at 8:39 AM, Alexander Korotkov
<a.korotkov@postgrespro.ru> wrote:

That appears to be wrong. I intended to make cost_sort prefer plain sort
over incremental sort for this dataset size. But, that appears to be not
always right solution. Quick sort is so fast only on presorted data.

As you may know, I've often said that the precheck for sorted input
added to our quicksort implementation by a3f0b3d is misguided. It
sometimes throws away a ton of work if the presorted input isn't
*perfectly* presorted. This happens when the first out of order tuple
is towards the end of the presorted input.

I think that it isn't fair to credit our qsort with doing so well on a
100% presorted case, because it doesn't do the necessary bookkeeping
to not throw that work away completely in certain important cases.

--
Peter Geoghegan

VMware vCenter Server
https://www.vmware.com/

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#20Alexander Korotkov
aekorotkov@gmail.com
In reply to: Peter Geoghegan (#19)
Re: [PATCH] Incremental sort

On Wed, Apr 26, 2017 at 7:56 PM, Peter Geoghegan <pg@bowt.ie> wrote:

On Wed, Apr 26, 2017 at 8:39 AM, Alexander Korotkov
<a.korotkov@postgrespro.ru> wrote:

That appears to be wrong. I intended to make cost_sort prefer plain sort
over incremental sort for this dataset size. But, that appears to be not
always right solution. Quick sort is so fast only on presorted data.

As you may know, I've often said that the precheck for sorted input
added to our quicksort implementation by a3f0b3d is misguided. It
sometimes throws away a ton of work if the presorted input isn't
*perfectly* presorted. This happens when the first out of order tuple
is towards the end of the presorted input.

I think that it isn't fair to credit our qsort with doing so well on a
100% presorted case, because it doesn't do the necessary bookkeeping
to not throw that work away completely in certain important cases.

OK, I get it. Our qsort is so fast not only on 100% presorted case.
However, that doesn't change many things in context of incremental sort.

------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

In reply to: Alexander Korotkov (#20)
#22Alexander Korotkov
aekorotkov@gmail.com
In reply to: Peter Geoghegan (#21)
#23Robert Haas
robertmhaas@gmail.com
In reply to: Alexander Korotkov (#18)
#24Alexander Korotkov
aekorotkov@gmail.com
In reply to: Robert Haas (#23)
#25Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#24)
#26Robert Haas
robertmhaas@gmail.com
In reply to: Alexander Korotkov (#25)
#27Alexander Korotkov
aekorotkov@gmail.com
In reply to: Robert Haas (#26)
#28Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#27)
#29Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#28)
#30Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#29)
#31Robert Haas
robertmhaas@gmail.com
In reply to: Alexander Korotkov (#30)
#32Alexander Korotkov
aekorotkov@gmail.com
In reply to: Robert Haas (#31)
#33Antonin Houska
ah@cybertec.at
In reply to: Alexander Korotkov (#27)
#34Alexander Korotkov
aekorotkov@gmail.com
In reply to: Antonin Houska (#33)
#35Antonin Houska
ah@cybertec.at
In reply to: Antonin Houska (#33)
#36Thomas Munro
thomas.munro@gmail.com
In reply to: Alexander Korotkov (#34)
#37Alexander Korotkov
aekorotkov@gmail.com
In reply to: Antonin Houska (#35)
#38Alexander Korotkov
aekorotkov@gmail.com
In reply to: Thomas Munro (#36)
In reply to: Alexander Korotkov (#37)
#40Thomas Munro
thomas.munro@gmail.com
In reply to: Alexander Korotkov (#38)
#41Antonin Houska
ah@cybertec.at
In reply to: Alexander Korotkov (#37)
#42Michael Paquier
michael@paquier.xyz
In reply to: Alexander Korotkov (#5)
#43Alexander Korotkov
aekorotkov@gmail.com
In reply to: Antonin Houska (#41)
#44Antonin Houska
ah@cybertec.at
In reply to: Alexander Korotkov (#43)
#45Alexander Korotkov
aekorotkov@gmail.com
In reply to: Thomas Munro (#40)
#46Alexander Korotkov
aekorotkov@gmail.com
In reply to: Antonin Houska (#44)
#47Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#46)
#48Tels
nospam-pg-abuse@bloodgate.com
In reply to: Alexander Korotkov (#47)
#49Alexander Korotkov
aekorotkov@gmail.com
In reply to: Tels (#48)
#50Antonin Houska
ah@cybertec.at
In reply to: Alexander Korotkov (#46)
#51Alexander Korotkov
aekorotkov@gmail.com
In reply to: Antonin Houska (#50)
#52Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#51)
#53Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alexander Korotkov (#52)
#54Alexander Korotkov
aekorotkov@gmail.com
In reply to: Tomas Vondra (#53)
#55Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alexander Korotkov (#54)
#56Alexander Korotkov
aekorotkov@gmail.com
In reply to: Tomas Vondra (#55)
#57Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#56)
#58Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alexander Korotkov (#57)
#59Alexander Korotkov
aekorotkov@gmail.com
In reply to: Tomas Vondra (#58)
#60Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alexander Korotkov (#59)
#61Alexander Korotkov
aekorotkov@gmail.com
In reply to: Tomas Vondra (#60)
In reply to: Alexander Korotkov (#61)
#63Alexander Korotkov
aekorotkov@gmail.com
In reply to: Darafei "Komяpa" Praliaskouski (#62)
#64Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#63)
#65Teodor Sigaev
teodor@sigaev.ru
In reply to: Alexander Korotkov (#64)
#66Teodor Sigaev
teodor@sigaev.ru
In reply to: Alexander Korotkov (#64)
#67Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Teodor Sigaev (#66)
#68Alexander Korotkov
aekorotkov@gmail.com
In reply to: Tomas Vondra (#67)
#69Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alexander Korotkov (#68)
#70Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Teodor Sigaev (#66)
#71Andres Freund
andres@anarazel.de
In reply to: Teodor Sigaev (#66)
#72Alexander Korotkov
aekorotkov@gmail.com
In reply to: Andres Freund (#71)
#73Alexander Kuzmenkov
a.kuzmenkov@postgrespro.ru
In reply to: Alexander Korotkov (#72)
#74Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alexander Kuzmenkov (#73)
#75Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#74)
#76Alexander Korotkov
aekorotkov@gmail.com
In reply to: Tomas Vondra (#75)
#77Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alexander Korotkov (#76)
#78Alexander Korotkov
aekorotkov@gmail.com
In reply to: Tomas Vondra (#77)
#79Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alexander Korotkov (#78)
#80Alexander Kuzmenkov
a.kuzmenkov@postgrespro.ru
In reply to: Tomas Vondra (#79)
#81Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Kuzmenkov (#80)
#82Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#81)
#83Teodor Sigaev
teodor@sigaev.ru
In reply to: Alexander Korotkov (#82)
#84Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Teodor Sigaev (#83)
#85Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alvaro Herrera (#70)
#86Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alexander Korotkov (#85)
#87Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#86)
#88Teodor Sigaev
teodor@sigaev.ru
In reply to: Tom Lane (#86)
#89Alexander Korotkov
aekorotkov@gmail.com
In reply to: Teodor Sigaev (#83)
#90Tom Lane
tgl@sss.pgh.pa.us
In reply to: Teodor Sigaev (#88)
#91Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tom Lane (#90)
#92Alexander Korotkov
aekorotkov@gmail.com
In reply to: Tomas Vondra (#91)
#93David Steele
david@pgmasters.net
In reply to: Alexander Korotkov (#92)
#94Alexander Korotkov
aekorotkov@gmail.com
In reply to: David Steele (#93)
#95James Coleman
jtc331@gmail.com
In reply to: Alexander Korotkov (#94)
#96Alexander Korotkov
aekorotkov@gmail.com
In reply to: James Coleman (#95)
#97James Coleman
jtc331@gmail.com
In reply to: Alexander Korotkov (#96)
#98Tom Lane
tgl@sss.pgh.pa.us
In reply to: James Coleman (#97)
#99James Coleman
jtc331@gmail.com
In reply to: Tom Lane (#98)
#100Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#99)
#101Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alexander Korotkov (#96)
#102Dmitry Dolgov
9erthalion6@gmail.com
In reply to: Tomas Vondra (#100)
#103Shaun Thomas
shaun.thomas@2ndquadrant.com
In reply to: Dmitry Dolgov (#102)
#104James Coleman
jtc331@gmail.com
In reply to: Shaun Thomas (#103)
#105James Coleman
jtc331@gmail.com
In reply to: James Coleman (#104)
#106Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#105)
#107James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#106)
#108Rafia Sabih
rafia.pghackers@gmail.com
In reply to: James Coleman (#107)
#109James Coleman
jtc331@gmail.com
In reply to: Rafia Sabih (#108)
#110Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#109)
#111Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Rafia Sabih (#108)
#112James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#111)
#113James Coleman
jtc331@gmail.com
In reply to: James Coleman (#112)
#114Simon Riggs
simon@2ndQuadrant.com
In reply to: Rafia Sabih (#108)
#115Simon Riggs
simon@2ndQuadrant.com
In reply to: James Coleman (#113)
#116James Coleman
jtc331@gmail.com
In reply to: Simon Riggs (#115)
#117Simon Riggs
simon@2ndQuadrant.com
In reply to: James Coleman (#116)
#118Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#116)
#119Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Simon Riggs (#117)
#120James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#118)
#121Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#120)
#122James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#121)
In reply to: James Coleman (#122)
#124James Coleman
jtc331@gmail.com
In reply to: Peter Geoghegan (#123)
In reply to: James Coleman (#124)
#126Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Peter Geoghegan (#125)
#127James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#126)
#128Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#127)
#129James Coleman
jtc331@gmail.com
In reply to: James Coleman (#113)
#130James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#128)
#131Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#130)
#132James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#131)
#133Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#130)
#134James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#133)
#135Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#134)
#136James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#135)
#137Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#136)
#138James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#137)
#139Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#138)
#140James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#139)
#141Alexander Korotkov
aekorotkov@gmail.com
In reply to: Tomas Vondra (#106)
#142Alexander Korotkov
aekorotkov@gmail.com
In reply to: James Coleman (#129)
#143Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#140)
#144James Coleman
jtc331@gmail.com
In reply to: James Coleman (#140)
#145Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#143)
#146James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#145)
#147James Coleman
jtc331@gmail.com
In reply to: Alexander Korotkov (#142)
#148Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#146)
#149James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#148)
#150Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#149)
#151James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#150)
#152Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#151)
#153James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#143)
#154Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#153)
#155James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#154)
#156Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#155)
#157James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#156)
#158James Coleman
jtc331@gmail.com
In reply to: James Coleman (#157)
#159Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#158)
#160James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#159)
#161Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#160)
#162Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#161)
#163Rafia Sabih
rafia.pghackers@gmail.com
In reply to: Tomas Vondra (#162)
#164Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Rafia Sabih (#163)
#165Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#164)
#166Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tomas Vondra (#162)
#167James Coleman
jtc331@gmail.com
In reply to: Alvaro Herrera (#166)
#168Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alvaro Herrera (#166)
#169Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#167)
#170James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#169)
#171James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#156)
#172Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#171)
#173James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#165)
#174James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#172)
#175James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#168)
#176Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#175)
#177Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#173)
#178Michael Paquier
michael@paquier.xyz
In reply to: Tomas Vondra (#177)
#179Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Michael Paquier (#178)
#180Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#179)
#181James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#180)
#182Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#181)
#183James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#182)
#184David Steele
david@pgmasters.net
In reply to: James Coleman (#183)
#185Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: David Steele (#184)
#186James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#185)
#187James Coleman
jtc331@gmail.com
In reply to: James Coleman (#181)
#188Tom Lane
tgl@sss.pgh.pa.us
In reply to: James Coleman (#187)
#189James Coleman
jtc331@gmail.com
In reply to: Tom Lane (#188)
#190Tom Lane
tgl@sss.pgh.pa.us
In reply to: James Coleman (#189)
#191James Coleman
jtc331@gmail.com
In reply to: Tom Lane (#190)
#192James Coleman
jtc331@gmail.com
In reply to: James Coleman (#181)
#193James Coleman
jtc331@gmail.com
In reply to: James Coleman (#192)
#194Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#193)
#195Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tomas Vondra (#194)
#196Justin Pryzby
pryzby@telsasoft.com
In reply to: Tomas Vondra (#194)
#197James Coleman
jtc331@gmail.com
In reply to: Alvaro Herrera (#195)
#198James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#194)
#199Tom Lane
tgl@sss.pgh.pa.us
In reply to: James Coleman (#198)
#200Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#199)
#201James Coleman
jtc331@gmail.com
In reply to: Justin Pryzby (#196)
#202Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#198)
#203James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#194)
#204Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: James Coleman (#197)
#205Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#204)
#206Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#205)
#207Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#206)
#208James Coleman
jtc331@gmail.com
In reply to: James Coleman (#203)
#209Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#208)
#210James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#209)
#211James Coleman
jtc331@gmail.com
In reply to: James Coleman (#210)
#212James Coleman
jtc331@gmail.com
In reply to: James Coleman (#211)
#213James Coleman
jtc331@gmail.com
In reply to: James Coleman (#212)
#214James Coleman
jtc331@gmail.com
In reply to: James Coleman (#213)
#215Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#214)
#216James Coleman
jtc331@gmail.com
In reply to: James Coleman (#197)
#217James Coleman
jtc331@gmail.com
In reply to: James Coleman (#216)
#218James Coleman
jtc331@gmail.com
In reply to: Tom Lane (#207)
#219James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#215)
#220Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#219)
#221Andreas Karlsson
andreas.karlsson@percona.com
In reply to: Tomas Vondra (#220)
#222James Coleman
jtc331@gmail.com
In reply to: Andreas Karlsson (#221)
#223Andreas Karlsson
andreas.karlsson@percona.com
In reply to: James Coleman (#222)
#224James Coleman
jtc331@gmail.com
In reply to: Andreas Karlsson (#223)
#225James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#220)
#226Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#224)
#227Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: James Coleman (#225)
#228Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#227)
#229James Coleman
jtc331@gmail.com
In reply to: Tom Lane (#228)
#230James Coleman
jtc331@gmail.com
In reply to: James Coleman (#225)
#231Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: James Coleman (#230)
#232James Coleman
jtc331@gmail.com
In reply to: Alvaro Herrera (#231)
#233Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#232)
#234James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#233)
#235James Coleman
jtc331@gmail.com
In reply to: James Coleman (#234)
#236James Coleman
jtc331@gmail.com
In reply to: James Coleman (#235)
#237James Coleman
jtc331@gmail.com
In reply to: James Coleman (#236)
#238Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#237)
#239James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#238)
#240Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#239)
#241James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#240)
#242Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#241)
#243James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#242)
#244Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#241)
#245James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#244)
#246Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#244)
#247James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#246)
#248Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#247)
#249James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#248)
#250James Coleman
jtc331@gmail.com
In reply to: James Coleman (#249)
#251Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#250)
#252James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#251)
#253Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#252)
#254James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#253)
#255Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#254)
#256Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: James Coleman (#254)
#257James Coleman
jtc331@gmail.com
In reply to: Alvaro Herrera (#256)
#258Tom Lane
tgl@sss.pgh.pa.us
In reply to: James Coleman (#257)
#259James Coleman
jtc331@gmail.com
In reply to: Tom Lane (#258)
#260Tom Lane
tgl@sss.pgh.pa.us
In reply to: James Coleman (#259)
#261James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#255)
#262Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#261)
#263James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#262)
#264Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tomas Vondra (#262)
#265Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#263)
#266Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tom Lane (#264)
#267James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#266)
#268Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#267)
#269James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#268)
#270Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#260)
#271Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#269)
#272James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#271)
#273Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#272)
#274James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#273)
#275Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#274)
#276James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#275)
#277James Coleman
jtc331@gmail.com
In reply to: James Coleman (#276)
#278Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#277)
#279James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#278)
#280Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#279)
#281James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#280)
#282Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#281)
#283James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#282)
#284James Coleman
jtc331@gmail.com
In reply to: James Coleman (#283)
#285James Coleman
jtc331@gmail.com
In reply to: James Coleman (#283)
#286Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#285)
#287Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#286)
#288Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#286)
#289Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#288)
#290Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tomas Vondra (#289)
#291Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tom Lane (#290)
#292Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tomas Vondra (#291)
#293Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#292)
#294Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Alvaro Herrera (#293)
#295James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#294)
#296James Coleman
jtc331@gmail.com
In reply to: James Coleman (#295)
#297James Coleman
jtc331@gmail.com
In reply to: James Coleman (#296)
#298Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#294)
#299James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#298)
#300Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tomas Vondra (#298)
#301Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#299)
#302Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tom Lane (#300)
#303Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tomas Vondra (#302)
#304Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tom Lane (#303)
#305James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#301)
#306James Coleman
jtc331@gmail.com
In reply to: James Coleman (#305)
#307Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#305)
#308Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tomas Vondra (#307)
#309James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#307)
#310Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#306)
#311Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tom Lane (#308)
#312Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tomas Vondra (#311)
#313James Coleman
jtc331@gmail.com
In reply to: Tom Lane (#312)
#314Tom Lane
tgl@sss.pgh.pa.us
In reply to: James Coleman (#313)
#315James Coleman
jtc331@gmail.com
In reply to: Tom Lane (#314)
#316Tom Lane
tgl@sss.pgh.pa.us
In reply to: James Coleman (#315)
#317Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tom Lane (#316)
#318Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tomas Vondra (#317)
#319Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tom Lane (#318)
#320Justin Pryzby
pryzby@telsasoft.com
In reply to: Tomas Vondra (#288)
#321James Coleman
jtc331@gmail.com
In reply to: Justin Pryzby (#320)
#322Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#321)
#323Justin Pryzby
pryzby@telsasoft.com
In reply to: James Coleman (#321)
#324Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Justin Pryzby (#320)
#325James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#324)
#326Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#325)
#327James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#326)
#328Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#288)
#329Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tomas Vondra (#328)
#330Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tom Lane (#329)
#331Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#330)
#332James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#331)
#333Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#332)
#334Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#333)
#335James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#334)
#336David Steele
david@pgmasters.net
In reply to: James Coleman (#335)
#337Tom Lane
tgl@sss.pgh.pa.us
In reply to: James Coleman (#335)
#338James Coleman
jtc331@gmail.com
In reply to: David Steele (#336)
#339Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#335)
#340Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: James Coleman (#338)
#341James Coleman
jtc331@gmail.com
In reply to: Tomas Vondra (#339)
#342James Coleman
jtc331@gmail.com
In reply to: James Coleman (#341)
#343Tom Lane
tgl@sss.pgh.pa.us
In reply to: James Coleman (#342)
#344James Coleman
jtc331@gmail.com
In reply to: Tom Lane (#343)
#345Justin Pryzby
pryzby@telsasoft.com
In reply to: Justin Pryzby (#323)
#346James Coleman
jtc331@gmail.com
In reply to: Justin Pryzby (#345)
#347Justin Pryzby
pryzby@telsasoft.com
In reply to: James Coleman (#346)
#348Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Justin Pryzby (#347)
#349Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#348)
In reply to: Tomas Vondra (#349)
#351Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Peter Geoghegan (#350)
#352Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#351)
In reply to: Tomas Vondra (#352)
#354Justin Pryzby
pryzby@telsasoft.com
In reply to: James Coleman (#321)
#355James Coleman
jtc331@gmail.com
In reply to: Justin Pryzby (#354)
#356James Coleman
jtc331@gmail.com
In reply to: James Coleman (#355)
#357Jonathan S. Katz
jkatz@postgresql.org
In reply to: James Coleman (#356)
In reply to: Jonathan S. Katz (#357)
In reply to: James Coleman (#356)