Re: [PATCH] Incremental sort
Alexander Korotkov <a.korotkov@postgrespro.ru>
Attachments
- incremental-sort-7.patch (application/octet-stream) patch
- results.csv (text/csv)
- incsort_test.py (text/x-python-script)
On Thu, Apr 27, 2017 at 5:23 PM, Alexander Korotkov < a.korotkov@postgrespro.ru> wrote: > On Thu, Apr 27, 2017 at 5:06 PM, Robert Haas <robertmhaas@gmail.com> > wrote: > >> On Wed, Apr 26, 2017 at 11:39 AM, Alexander Korotkov >> <a.korotkov@postgrespro.ru> wrote: >> > 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. >> > >> > 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. >> > >> > Any thoughts? >> >> Nice idea. > > > Cool. > Than I'm going to make a set of synthetic performance tests in order to > ensure that there is no regression. > Next revision of patch is attached. This revision contains one important optimization. I found that it's not necessary to make every tuple go through prevTuple slot. It's enough to save single sample tuple per sort group in order to compare skip columns with it. This optimization allows to evade regression on large sort groups which I have observed. I'm also attaching python script (incsort_test.py) which I use for synthetic performance benchmarking. This script runs benchmarks which are similar to one posted by Heikki, but with some variations. These benchmarks are aimed to check if there are cases when incremental sort is slower than plain sort. This script generates tables with structure described in 'tables' array. For generation of texts, md5 function is used. For first GroupedCols number of table columns, groups of GroupSize equal values are generated. Then there are columns which values are just sequential. In the last column have PreorderedFrac fraction of sequential values and rest of values are random. Therefore, we can measure influence of presorted optimization in qsort with various fractions of presorted data. Also there is btree index which covers all the columns of that table. The benchmark query select contents of generated table order by grouped columns and by last column. Index only scan outputs tuples ordered by grouped columns, and incremental sort have to perform sorting inside those groups. Plain sort case is forced to also use index only scans, in order to compare sort methods not scan methods. Results are also attached (results.csv). Last column contains difference between incremental and plain sort time in percents. Negative value mean that incremental sort is faster in this case. Incremental sort is faster in vast majority of cases. It appears to be slower only when whose dataset is one sort group. In this case incremental sort is useless, and it should be considered as misuse of incremental sort. Slowdown is related to the fact that we anyway have to do extra comparisons, unless we somehow push our comparison result into qsort itself and save some cpu cycles (but that would be unreasonable break of encapsulation). Thus, in such cases regression seems to be inevitable anyway. I think we could evade this regression during query planning. If we see that there would be only few groups, we should choose plain sort instead of incremental sort. Any thoughts? ------ Alexander Korotkov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company
Commits
-
Further adjustments to Hashagg EXPLAIN ANALYZE output
- 40efbf8706cd 14.0 cited
-
Rework EXPLAIN format for incremental sort
- 6a918c3ac8a6 13.0 landed
-
Fix typos and improve incremental sort comments
- 1a40d37a9faf 13.0 landed
-
Stabilize incremental_sort tests
- cea09246e578 13.0 landed
-
Minor improvements in Incremental Sort explain
- d22782a5392f 13.0 landed
-
Consider Incremental Sort paths at additional places
- ba3e76cc571e 13.0 landed
-
Fix representation of SORT_TYPE_STILL_IN_PROGRESS.
- c7654f6a3779 13.0 landed
-
Fix failures in incremental_sort due to number of workers
- 23ba3b5ee278 13.0 landed
-
Fix show_incremental_sort_info with force_parallel_mode
- 7d6d82a52493 13.0 landed
-
Implement Incremental Sort
- d2d8a229bc58 13.0 landed
-
Fix handling of "Subplans Removed" field in EXPLAIN output.
- 7d91b604d9b5 13.0 cited
-
Fix EXPLAIN (SETTINGS) to follow policy about when to print empty fields.
- 3ec20c7091e9 13.0 cited
-
Ensure plpgsql result tuples have the right composite type marking.
- 5683b34956b4 13.0 cited
-
Propagate sort instrumentation from workers back to leader.
- bf11e7ee2e36 11.0 cited
-
Make new regression test case parallel-safe, and improve its output.
- 1177ab1dabf7 11.0 cited
-
Push limit through subqueries to underlying sort, where possible.
- 1f6d515a67ec 11.0 cited
-
Fix inappropriate printing of never-measured times in EXPLAIN.
- 4b234fd8bf21 9.6.0 cited
-
Fix some infelicities in EXPLAIN output for parallel query plans.
- 8ebb69f85445 9.6.0 cited