Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jJl7z-0003db-97 for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Apr 2020 21:42:27 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1jJl7x-0004IA-WD for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Apr 2020 21:42:26 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jJl7x-0004I2-HO for pgsql-hackers@lists.postgresql.org; Wed, 01 Apr 2020 21:42:25 +0000 Received: from mail-wr1-x444.google.com ([2a00:1450:4864:20::444]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1jJl7t-0003Lw-Cz for pgsql-hackers@lists.postgresql.org; Wed, 01 Apr 2020 21:42:24 +0000 Received: by mail-wr1-x444.google.com with SMTP id d5so1882697wrn.2 for ; Wed, 01 Apr 2020 14:42:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=2ndquadrant-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=ntwlU7FiRdXbjmLoP08ZI4AZ0aEhtixs98zxPP5aGYY=; b=hU+zY4SKjKimAa+zN6umNuCMvuFQ/KWMfKdHpigE3jEdhBAdGCxbfmIpaHTflinx3B R+GtzhGBYhV2x57rw00lQTYfX97QOcjH/FNGhWLBh1ewLoMZ/VYi5GSqxoTS3wNh3GR1 u4mp/zZmSlnTkant2br3mZLsYoNFJEHCVqQVKjA0eabMfQoRb9SJJb101rzSd/TDOXdR rmNr4y0BxkpccBpp/WmWyg1agLSzBGutOPkSK2I6iAyx31VBMrD2AaVw/PB4fcrzrGLO M4vBxDfqjTq4A3XWREDIUCyKCLlApBlCVlSUFoLdxsGaTuxqYeNG3lx11Y7rR9Y6pUDa VlYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=ntwlU7FiRdXbjmLoP08ZI4AZ0aEhtixs98zxPP5aGYY=; b=UBhJuWwmYzLQS82/HUjjIg/xiDAgna15Bln+751xMPIPjQqVIiqI6PZTzj98KU+Cqf ZDfhiSk+HCaGrudm8b5xPN3GvM698wEMLrTgbUHs5gAwrWmWSJlVFYtIqxScJ/KiPSzA 4pDk8Ls3wPL4D2XSMsjngC8x6IRIg1bnD2dIE6bgDrKi1FT6HKpJqZtHVceFo7Jg8hvw tdmgWDrmORf1f6pr1QdnfFV5OYM/ugP7FAqWrAhXKUclosXjfo1nq1gt2gPB8/2MrSLM FARPJ4V+odlT18fgWjTZFCjxPCoGGHBu9KJ7g/k789gcH1FartBjzRMvpA775LCWkwTj taVA== X-Gm-Message-State: AGi0PuZr7Qw8UhQCyJ9Ya3tkWw4+yg8bld/BF2eFuEuWlYou2r7Y601N 5gR+wLocWE0WGWIZoaYKdd0eIQ== X-Google-Smtp-Source: APiQypLE68Ww54pQkzi7GeGQaOuUmrKFw9KxWYMqD9QDkF7+nzYbL5I7y36c/5N/BFg0vTC9YpQVcg== X-Received: by 2002:adf:f0d0:: with SMTP id x16mr31186wro.246.1585777339645; Wed, 01 Apr 2020 14:42:19 -0700 (PDT) Received: from localhost (ip-86-49-253-141.net.upcbroadband.cz. [86.49.253.141]) by smtp.gmail.com with ESMTPSA id d7sm4408704wrr.77.2020.04.01.14.42.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2020 14:42:17 -0700 (PDT) Date: Wed, 1 Apr 2020 23:42:15 +0200 From: Tomas Vondra To: James Coleman Cc: Tom Lane , Alvaro Herrera , Michael Paquier , Rafia Sabih , Peter Geoghegan , Simon Riggs , Shaun Thomas , Dmitry Dolgov <9erthalion6@gmail.com>, Alexander Korotkov , PostgreSQL Developers , Andreas Karlsson Subject: Re: [PATCH] Incremental sort (was: PoC: Partial sort) Message-ID: <20200401214215.ut6b72e3zlbm33w2@development> References: <20200331235619.ezleuyqjjjy67lh7@development> <20200401003809.pup7i7yr6pwramk3@development> <20200401015925.bmbbqc3ple5rf3yn@development> <20200401024424.g4uuerdvxqohvzks@development> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="p6pbabqhbwscvpm5" Content-Disposition: inline In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --p6pbabqhbwscvpm5 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline On Wed, Apr 01, 2020 at 09:05:27AM -0400, James Coleman wrote: >On Tue, Mar 31, 2020 at 11:07 PM James Coleman wrote: >> >> On Tue, Mar 31, 2020 at 10:44 PM Tomas Vondra >> wrote: >> > >> > On Tue, Mar 31, 2020 at 10:12:29PM -0400, James Coleman wrote: >> > >On Tue, Mar 31, 2020 at 9:59 PM Tomas Vondra >> > > wrote: >> > >> >> > >> On Tue, Mar 31, 2020 at 08:42:47PM -0400, James Coleman wrote: >> > >> >On Tue, Mar 31, 2020 at 8:38 PM Tomas Vondra >> > >> > wrote: >> > >> >> >> > >> >> On Tue, Mar 31, 2020 at 08:11:15PM -0400, James Coleman wrote: >> > >> >> >On Tue, Mar 31, 2020 at 7:56 PM Tomas Vondra >> > >> >> > wrote: >... >> > >> >> >One small idea, but I'm not yet sure it helps us a whole lot: if the >> > >> >> >query pathkeys is only length 1, then we could skip the additional >> > >> >> >path creation. >> > >> >> > >> > >> >> >> > >> >> I don't follow. Why would we create incremental sort in this case at >> > >> >> all? With single-element query_pathkeys the path is either unsorted or >> > >> >> fully sorted - there's no room for incremental sort. No? >> > >> > >> > >> >Well, we shouldn't, that's what I'm getting. But I didn't see anything >> > >> >in the code now that explicitly excludes that case when decided >> > >> >whether or not to create an incremental sort path, unless I'm missing >> > >> >something obvious. >> > >> >> > >> Well, my point is that create_ordered_paths() looks like this: >> > >> >> > >> is_sorted = pathkeys_common_contained_in(root->sort_patkeys, ...); >> > >> >> > >> if (is_sorted) >> > >> { >> > >> ... old code >> > >> } >> > >> else >> > >> { >> > >> if (input_path == cheapest_input_path) >> > >> { >> > >> ... old code >> > >> } >> > >> >> > >> /* With incremental sort disabled, don't build those paths. */ >> > >> if (!enable_incrementalsort) >> > >> continue; >> > >> >> > >> /* Likewise, if the path can't be used for incremental sort. */ >> > >> if (!presorted_keys) >> > >> continue; >> > >> >> > >> ... incremental sort path >> > >> } >> > >> >> > >> Now, with single-item sort_pathkeys, the input path can't be partially >> > >> sorted. It's either fully sorted - in which case it's handled by the >> > >> first branch. Or it's not sorted at all, so presorted_keys==0 and we >> > >> never get to the incremental path. >> > >> >> > >> Or did you mean to use the optimization somewhere else? >> > > >> > >Hmm, yes, I didn't think through that properly. I'll have to look at >> > >the other cases to confirm the same logic applies there. > >I looked through this more carefully, and I did end up finding a few >places where we can skip iterating through a list of paths entirely >with this check, so I added it there. I also cleaned up some comments, >added comments and asserts to the other places where >list_length(pathkeys) should be guaranteed to be > 1, removed a few >asserts I found unnecessary, and merged duplicative >pathkeys_[count_]_contained_in calls. > OK >> > >One other thing:in the code above we create the regular sort path >> > >inside of `if (input_path == cheapest_input_path)`, but incremental >> > >sort is outside of that condition. I'm not sure I'm remembering why >> > >that was, and it's not obvious to me reading it right now (though it's >> > >getting late here, so maybe I'm just not thinking clearly). Do you >> > >happen to remember why that is? >> > > >> > >> > It's because for the regular sort, the path is either already sorted or >> > it requires a full sort. But full sort only makes sense on the cheapest >> > path, because we assume the additional sort cost is independent of the >> > input cost, essentially >> > >> > cost(path + Sort) = cost(path) + cost(Sort) >> > >> > and it's always >> > >> > cost(path) + cost(Sort) >= cost(cheapest path) + cost(Sort) >> > >> > and by checking for cheapest path we simply skip building all the paths >> > that we'd end up discarding anyway. >> > >> > With incremental sort we can't do this, the cost of the incremental sort >> > depends on how well presorted is the input path. > >Thanks for the explanation. I've added a comment to that effect. > Thanks. I've realized the way get_useful_pathkeys_for_relation() is coded kinda works against the fastpath we added when comparing pathkeys. That depends on comparing pointers to the list, but we've been building new lists (and then returned those) which defeats the optimization. Attached is a patch that returns the original list in most cases (and only creates a copy when really necessary). This might also save a few cycles on bulding the new list, of course. I've done a bunch of read-only pgbench tests with fairly small scales (1 and 10). First with the built-in read-only transaction, and also with a simple custom query doing an order-by. And I did this both on the default schema and with a bunch of extra indexes. The script I used to run this is attached, along with a summary of results. There are results for master and v40 and v50 patches (the v50 also includes the extra patch fixing get_useful_pathkeys_for_relation). Overall, I'm happy with those results - the v50 seems to be within 1% of master, in both directions. This very much seems like a noise. I still want to do a bit more review of the costing / tuplesort changes, which I plan to do tomorrow. If that goes well, I plan to start committing this. So please if you think this is not ready or wants more time for a review, let me know. I'm not yet sure if I'll commit this as a single change, or in three separate commits. James, can you review the proposed extra fix and merge the fixes into the main patches? regards -- Tomas Vondra http://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services --p6pbabqhbwscvpm5 Content-Type: application/x-sh Content-Disposition: attachment; filename="run-pgbench.sh" Content-Transfer-Encoding: quoted-printable pgbench -i -s 1 test > /dev/null 2>&1=0Apsql test -c 'vacuum analyze' > /de= v/null 2>&1=0Apsql test -c 'checkpoint' > /dev/null 2>&1=0A=0Aecho '\set ai= d random(1, 100000 * :scale)' > select.sql=0Aecho 'SELECT abalance FROM pgb= ench_accounts WHERE aid =3D :aid ORDER BY aid, bid;' >> select.sql=0A=0A=0A= for r in `seq 1 10`; do=0A=0A tps=3D`pgbench -n -S -M simple -T 30 t= est 2>&1 | grep excluding | awk '{print $3}'`=0A=0A echo "simple bui= lt-in $r $tps"=0A=0Adone=0A=0Afor r in `seq 1 10`; do=0A=0A tps=3D`p= gbench -n -S -M prepared -T 30 test 2>&1 | grep excluding | awk '{print $3}= '`=0A=0A echo "prepared built-in $r $tps"=0A=0Adone=0A=0Afor r in `s= eq 1 10`; do=0A=0A tps=3D`pgbench -n -f select.sql -M simple -T 30 t= est 2>&1 | grep excluding | awk '{print $3}'`=0A=0A echo "simple cus= tom $r $tps"=0A=0Adone=0A=0Afor r in `seq 1 10`; do=0A=0A tps=3D`pgb= ench -n -f select.sql -M prepared -T 30 test 2>&1 | grep excluding | awk '{= print $3}'`=0A=0A echo "prepared custom $r $tps"=0A=0Adone=0A=0A=0Ap= sql test > /dev/null 2>&1 <&1 | grep excludi= ng | awk '{print $3}'`=0A=0A echo "simple-2 built-in $r $tps"=0A=0Ad= one=0A=0Afor r in `seq 1 10`; do=0A=0A tps=3D`pgbench -n -S -M prepa= red -T 30 test 2>&1 | grep excluding | awk '{print $3}'`=0A=0A echo = "prepared-2 built-in $r $tps"=0A=0Adone=0A=0Afor r in `seq 1 10`; do=0A=0A = tps=3D`pgbench -n -f select.sql -M simple -T 30 test 2>&1 | grep exc= luding | awk '{print $3}'`=0A=0A echo "simple-2 custom $r $tps"=0A= =0Adone=0A=0Afor r in `seq 1 10`; do=0A=0A tps=3D`pgbench -n -f sele= ct.sql -M prepared -T 30 test 2>&1 | grep excluding | awk '{print $3}'`=0A= =0A echo "prepared-2 custom $r $tps"=0A=0Adone=0A=0A --p6pbabqhbwscvpm5 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="0007-extra-patch.patch" From 6da44715c992718782aa634e16df10ee1fe7ecdf Mon Sep 17 00:00:00 2001 From: tt Date: Wed, 1 Apr 2020 18:08:52 +0200 Subject: [PATCH 7/7] extra patch --- src/backend/optimizer/path/allpaths.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 4a72dcf8bc..0534bb24c5 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -2757,7 +2757,7 @@ get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel) if (root->query_pathkeys) { ListCell *lc; - List *pathkeys = NIL; + int npathkeys = 0; /* useful pathkeys */ foreach(lc, root->query_pathkeys) { @@ -2778,11 +2778,21 @@ get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel) if (!find_em_expr_for_rel(pathkey_ec, rel)) break; - pathkeys = lappend(pathkeys, pathkey); + npathkeys++; } - if (pathkeys) - useful_pathkeys_list = lappend(useful_pathkeys_list, pathkeys); + /* + * The whole query_pathkeys list matches, so append it directly, to allow + * comparing pathkeys easily by comparing list pointer. If we have to truncate + * the pathkeys, we gotta do a copy though. + */ + if (npathkeys == list_length(root->query_pathkeys)) + useful_pathkeys_list = lappend(useful_pathkeys_list, + root->query_pathkeys); + else if (npathkeys > 0) + useful_pathkeys_list = lappend(useful_pathkeys_list, + list_truncate(list_copy(root->query_pathkeys), + npathkeys)); } return useful_pathkeys_list; -- 2.24.1 --p6pbabqhbwscvpm5 Content-Type: application/vnd.oasis.opendocument.spreadsheet Content-Disposition: attachment; filename="results-is.ods" Content-Transfer-Encoding: base64 UEsDBBQAAAgAAHSsgVCFbDmKLgAAAC4AAAAIAAAAbWltZXR5cGVhcHBsaWNhdGlvbi92bmQu b2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0UEsDBBQAAAgAAHSsgVC07gb+gyMAAIMj AAAYAAAAVGh1bWJuYWlscy90aHVtYm5haWwucG5niVBORw0KGgoAAAANSUhEUgAAAL0AAAD/ CAMAAACTmSdlAAAAZlBMVEUBAQELCwsREREeHh4jIyMtLS0zMzM9PT1DQ0NKSkpUVFRaWlpj Y2NqampycnJ7e3uDg4OMjIyTk5OampqkpKSrq6uzs7O7u7vDw8PLy8vT09Pb29vi4uLs7Oz0 9PT+/v4AAAD///9ZWvVZAAAi2ElEQVR42u1diWLbuK6N02lscV/Effv/v3wHctKmnSxN7u0s 99mJHMWkpGOKAnBIALxb/+bX3T8KTXi/Spx/F3rz0/9bKFzEZx+Mt47eG73Lpzph++3odymk lkXI3SuRvoak1K5kXaIPsawJqi/2rDobZ8OGUMbzII20iiuthzBaa+E3U7lyQD/52kPX4vej D10uPpwRXufFF9eaqbpW8nvMPoag/PkH9GLJ3a3uQ9zMWeWqF/NcP8g6pG7TGU5tL7sYcv4F 6GNXi8vSxOxmZ/gia2j0gCnENJrxURt/Vp0PuVSwq/gU3Rq2VLO4D2vqNoRuJg1G6LNRVeiv fwV6vcQu3aaVzNoXoYLuKND0DMRYhCg/o29S2T1NqbXL1S4B3Ma0gS4XpGUb9fsHOkj+02TO hyXmGPM3/zzf+fnD5x/9dMyfj/zTOdfd3f396dd/704fq07vT/9d3572v+98q3/3/exPr2f/ nZ7VPHbvzkD/+n2Zf/7ofsynsvlane+v/uVD/eDh9LFuc3kTPX8BfbKPKm+wlY+/b6Nvxo5m /NBaVW9qV9qv1ZTeIf36dHY4rUMy+4omAH3QEORaNafr2k1drh4Xi8tr3aum81japjXtaHu/ m+ldMX45b+duUvd7xumc215CL01seXmgL/Tkh+7t/gZ636ORLc055W4Hy45uVtzncqELm0pd 06ZtycKWuL8fbvI+h4y5s+Rajppsh+r04nMuNYxXczY9Z0iNH21/adFeKmtuP3fvQ2eVdY42 cvPhBfSZTwZRzHVjpC6mKtvk442eE1g+W94WNJObl8AUbl7g0tk4LpuVcUEhSAXsin894XyQ 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 z/8Z4q+0dkRsQM6jZ/qQ57TyH1VHr1BLBwi092jSBQEAAIMDAABQSwMEFAAACAAAdKyBUAAA AAAAAAAAAAAAABgAAABDb25maWd1cmF0aW9uczIvZmxvYXRlci9QSwMEFAAACAAAdKyBUAAA AAAAAAAAAAAAABgAAABDb25maWd1cmF0aW9uczIvbWVudWJhci9QSwMEFAAACAAAdKyBUAAA AAAAAAAAAAAAABwAAABDb25maWd1cmF0aW9uczIvYWNjZWxlcmF0b3IvUEsDBBQAAAgAAHSs gVAAAAAAAAAAAAAAAAAaAAAAQ29uZmlndXJhdGlvbnMyL3Rvb2xwYW5lbC9QSwMEFAAACAAA dKyBUAAAAAAAAAAAAAAAAB8AAABDb25maWd1cmF0aW9uczIvaW1hZ2VzL0JpdG1hcHMvUEsD BBQAAAgAAHSsgVAAAAAAAAAAAAAAAAAaAAAAQ29uZmlndXJhdGlvbnMyL3BvcHVwbWVudS9Q SwMEFAAACAAAdKyBUAAAAAAAAAAAAAAAABoAAABDb25maWd1cmF0aW9uczIvc3RhdHVzYmFy L1BLAwQUAAAIAAB0rIFQAAAAAAAAAAAAAAAAGAAAAENvbmZpZ3VyYXRpb25zMi90b29sYmFy L1BLAwQUAAAIAAB0rIFQAAAAAAAAAAAAAAAAHAAAAENvbmZpZ3VyYXRpb25zMi9wcm9ncmVz c2Jhci9QSwMEFAAICAgAdKyBUAAAAAAAAAAAAAAAAAgAAABtZXRhLnhtbI2TS4/TMBSF9/yK yMzW8SOZtLWSjMSC1SCQKIhd5dqeYHDsynEm5d+TZ0khC5Y+97v3HF8n+dO1NtGr8o12tgAk xiBSVjipbVWAL8f3cA+eyje5e3nRQjHpRFsrG2CtAo/6VtuwqVSA1lvmeKMbZnmtGhYEcxdl lxa2ptloNClXo+3PAnwP4cIQ6rou7pLY+QqRw+GAxuqCSnHjLq03IyUFUkYNDg0iMUELOyT8 31ADu47knLsZDfgUerSjGKdoOi905aU0Wxfo2QT1CXng8FWr7i2I5uuvFk5BuWx3iFHmYxht ddDcQOEVD86XR1fzJvrqrPQ8R5vI1Die+tGwd1UlxRRDnEJMjjRhJGGUxjjd7TJCaDLPue/I pWAbrckjS3FMUpoSmiUkRws28NshV4UpmpJ9YFtB2frRsPx0JOQDffw8B/mnft8mfgmjmnL3 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 AAAAAAAAGAAAAAAAAAAAAAAAAABkKwAAQ29uZmlndXJhdGlvbnMyL21lbnViYXIvUEsBAhQA FAAACAAAdKyBUAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAAAmisAAENvbmZpZ3VyYXRpb25z Mi9hY2NlbGVyYXRvci9QSwECFAAUAAAIAAB0rIFQAAAAAAAAAAAAAAAAGgAAAAAAAAAAAAAA AADUKwAAQ29uZmlndXJhdGlvbnMyL3Rvb2xwYW5lbC9QSwECFAAUAAAIAAB0rIFQAAAAAAAA AAAAAAAAHwAAAAAAAAAAAAAAAAAMLAAAQ29uZmlndXJhdGlvbnMyL2ltYWdlcy9CaXRtYXBz L1BLAQIUABQAAAgAAHSsgVAAAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAAAAEksAABDb25maWd1 cmF0aW9uczIvcG9wdXBtZW51L1BLAQIUABQAAAgAAHSsgVAAAAAAAAAAAAAAAAAaAAAAAAAA AAAAAAAAAIEsAABDb25maWd1cmF0aW9uczIvc3RhdHVzYmFyL1BLAQIUABQAAAgAAHSsgVAA AAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAALksAABDb25maWd1cmF0aW9uczIvdG9vbGJhci9Q SwECFAAUAAAIAAB0rIFQAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAADvLAAAQ29uZmlndXJh dGlvbnMyL3Byb2dyZXNzYmFyL1BLAQIUABQACAgIAHSsgVAbkILRtQEAAKkDAAAIAAAAAAAA AAAAAAAAACktAABtZXRhLnhtbFBLAQIUABQACAgIAHSsgVDrEs001wYAACEnAAAKAAAAAAAA AAAAAAAAABQvAABzdHlsZXMueG1sUEsBAhQAFAAICAgAdKyBUCvbH3QGCwAAIXIAAAsAAAAA AAAAAAAAAAAAIzYAAGNvbnRlbnQueG1sUEsBAhQAFAAICAgAdKyBUJ91+okxAQAALAQAABUA AAAAAAAAAAAAAAAAYkEAAE1FVEEtSU5GL21hbmlmZXN0LnhtbFBLBQYAAAAAEQARAGUEAADW QgAAAAA= --p6pbabqhbwscvpm5--