Re: Small improvement to compactify_tuples
Sokolov Yura <funny.falcon@postgrespro.ru>
From: Sokolov Yura <funny.falcon@postgrespro.ru>
To: Heikki Linnakangas <hlinnaka@iki.fi>
Cc: pgsql-hackers@postgresql.org, Heikki Linnakangas <hlinnaka@gmail.com>
Date: 2017-05-15T13:18:10Z
Lists: pgsql-hackers
Attachments
- 0002-bufpage.c-simplify-PageRepairFragmentation.patch (text/x-diff) patch 0002
Sokolov Yura писал 2017-05-15 15:08: > Heikki Linnakangas писал 2017-05-15 12:06: >> On 05/14/2017 09:47 PM, Sokolov Yura wrote: >>> Good day, everyone. >>> >>> I've been playing a bit with unlogged tables - just random updates on >>> simple >>> key-value table. I've noticed amount of cpu spent in a >>> compactify_tuples >>> (called by PageRepareFragmentaion). Most of time were spent in qsort >>> of >>> itemidbase items. >> >> Ah, I played with this too a couple of years ago, see >> https://www.postgresql.org/message-id/546B89DE.7030906%40vmware.com, >> but got distracted by other things and never got around to commit >> that. >> >>> itemidbase array is bounded by number of tuples in a page, and >>> itemIdSortData >>> structure is simple, so specialized version could be a better choice. >>> >>> Attached patch adds combination of one pass of prefix sort with >>> insertion >>> sort for larger array and shell sort for smaller array. >>> Insertion sort and shell sort are implemented as macros and could be >>> reused. >> >> Cool! Could you compare that against the bucket sort I posted in the >> above thread, please? >> >> At a quick glance, your "prefix sort" seems to be the the same >> algorithm as the bucket sort that I implemented. You chose 256 >> buckets, where I picked 32. And you're adding a shell sort >> implementation, for small arrays, while I used a straight insertion >> sort. Not sure what these differences mean in practice. >> >> - Heikki > > Thank you for attention. > > My first version of big page sort was almost exactly same to yours. > I had a bug in my insertion sort, so I had to refactor it. > (bug were fixed) > > I found that items in itemidbase are almost sorted, so it is important > to try keep its order in prefix sort. So I've changed --count[i] to > count[i+1]++. > > And it looks like it is better to have more buckets: > - with 256 buckets, size of single bucket is almost always less than 2, > so array is almost always sorted after prefix sort pass. > > But it looks like it is better to sort each bucket separately, as you > did, and as it was in my early version. > > Also I used your names for functions and some comments. > > I attached new version of the patch. > > I left memcpy intact cause it looks like it doesn't take noticable > cpu time. In a sequel, I propose to simplify PageRepairFragmentation in attached patch. -- Sokolov Yura aka funny.falcon Postgres Professional: https://postgrespro.ru The Russian Postgres Company
Commits
-
Avoid looping through line pointers twice in PageRepairFragmentation().
- a9169f0200fc 11.0 landed
-
Reduce pinning and buffer content locking for btree scans.
- 2ed5b87f96d4 9.5.0 cited
-
Speed up in-memory tuplesorting.
- 337b6f5ecf05 9.2.0 cited