Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1eyNeE-0002TV-CJ for pgsql-hackers@arkaria.postgresql.org; Tue, 20 Mar 2018 20:14:18 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1eyNeC-0004ZU-SX for pgsql-hackers@arkaria.postgresql.org; Tue, 20 Mar 2018 20:14:16 +0000 Received: from makus.postgresql.org ([2001:4800:1501:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1eyNeC-0004ZC-7g for pgsql-hackers@lists.postgresql.org; Tue, 20 Mar 2018 20:14:16 +0000 Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1eyNe8-0007pd-8L for pgsql-hackers@postgresql.org; Tue, 20 Mar 2018 20:14:14 +0000 Received: by mail-wr0-x242.google.com with SMTP id o8so3027928wra.1 for ; Tue, 20 Mar 2018 13:14:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=2ndquadrant-com.20150623.gappssmtp.com; s=20150623; h=subject:from:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language; bh=GXcLidcR9a02aqDl+cKkib/1XHHAIVprFM/0SrAaXjE=; b=VLE9mz4L+X86XexVVnO5QQwxAvmJmrq4djk4CrqL5ZPVk40hajSLElgI2/6/A410kO h/Rp/S/+RUVxbQDAVRO3sRfCQCa00204VS0zujLES01g0OobxutMCE/zlD6F4unl+ha2 Rrfotxtov15etyf/cqWLAfzRVz14n09Q7JuhOZXxDiDpn1l4Q9NzgJGA29++l9lae1MR xxTn8pEDRguE00Ot9Ueap8O2HGkbJGb5EMrnTIsOf5+NrVNXbe9QIwE2X56IW2zdNQSW vIb5e5V6h8Gw3CQIU8l8Dlrt3Q6/KNJ52qRsNfk2dUlM7Cg1JUvtdcLrKiN003KAlqAz NqzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language; bh=GXcLidcR9a02aqDl+cKkib/1XHHAIVprFM/0SrAaXjE=; b=rmf+/+ITpEwqOVnTTYizoK8WXcpWSHyhpmPvsxmp/szaTmjMHFbZLVea7ORZ/SMQnG jF7pKtavAI5E3TVs9S3aNvCe4i6MqptAioQ0Tg0+L0FmpSN99kBmv3AwPnqAwiAU9DiL dNzvAjfkzyzb7QXjTZfMheNXCDSSqI2hoYdSg3hzjDfTD8of60ZSzTzWCg5pPy+M9EDh 9PIgCdfu15Ta7LApZuP7pyG8oNonmG3+quzp5wx8yhOgnfWq5zFEtd/WrOKHbjPD0mOW DjK5SsNJXa7J6UcP+dZJ3pKXWXZB4zl/+UjHCbEpD9xIrNrEaAgGgw86ZICHzQ+vekmp 44Rw== X-Gm-Message-State: AElRT7HB0rovXwot2/jv3AE/n369adJihQNt2tZJPyhIcLl88rmCUoan 0EUILt/lXY79Vbr0jXemBD27tSA9bSt63VOZaCf6nZG9+o76zCBIPoYEMUnE8jhil5EQZCiSrqL JebqoDLzv76xUO8S3xWigFlCmXJ56HYbyb6qgxvAknORQGYBiH5lH2Q/zCOMzkmTaDZL3JoyVee G0CijpQpJv X-Google-Smtp-Source: AG47ELvB8Jqf3apROVsikjJsLFEXDw5+wfkelwE/EFmGo2iD6vDUK99m/8kFnEnUSdJr5oMefgJ40g== X-Received: by 10.223.135.155 with SMTP id b27mr625306wrb.119.1521576849972; Tue, 20 Mar 2018 13:14:09 -0700 (PDT) Received: from [10.137.2.19] (ip-78-102-97-226.net.upcbroadband.cz. [78.102.97.226]) by smtp.gmail.com with ESMTPSA id y145sm2201259wmd.43.2018.03.20.13.14.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 20 Mar 2018 13:14:07 -0700 (PDT) Subject: Re: [HACKERS] VACUUM and ANALYZE disagreeing on what reltuples means From: Tomas Vondra To: David Steele , Tom Lane Cc: Stephen Frost , Michael Paquier , Haribabu Kommi , "pgsql-hackers@postgresql.org" References: <16db4468-edfa-830a-f921-39a50498e77e@2ndquadrant.com> <19990.1500936945@sss.pgh.pa.us> <3d250597-384e-c5f4-7533-b513e366888f@2ndquadrant.com> <94f58897-861b-accf-a9f1-af4be816c0d3@2ndquadrant.com> <13097.1509650125@sss.pgh.pa.us> <3dca6a76-fa4b-66ab-c0db-496335d650b1@2ndquadrant.com> <20180105042528.GK2416@tamriel.snowman.net> <1e831867-c46c-8f21-79d4-5de70cac5822@2ndquadrant.com> <13711.1515440364@sss.pgh.pa.us> <01387f5d-a95b-d159-becb-cf9ff9ba4e41@2ndquadrant.com> <8b29edcb-cbc0-5414-996f-520f75b94d3b@2ndquadrant.com> Message-ID: <3b3d8eac-c709-0d25-088e-b98339a1b28a@2ndquadrant.com> Date: Tue, 20 Mar 2018 21:14:04 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 In-Reply-To: <8b29edcb-cbc0-5414-996f-520f75b94d3b@2ndquadrant.com> Content-Type: multipart/mixed; boundary="------------CE1D491042EE7CA94899420F" Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk This is a multi-part message in MIME format. --------------CE1D491042EE7CA94899420F Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Hi, So here is an updated version of the patch/fix, addressing the remaining issues in v3 posted by Tom in November. The 0001 part is actually a bugfix in bloom and spgist index AM, which did something like this: reltuples = IndexBuildHeapScan(...) result->heap_tuples = result->index_tuples = reltuples; That is, these two AMs simply used the number of heap rows for the index. That does not work for partial indexes, of course, where the correct index reltuples value is likely much lower. 0001 fixes this by tracking the number of actually indexed rows in the build states, just like in the other index AMs. A VACUUM or ANALYZE will fix the estimate, of course, but for tables that are not changing very much it may take quite a while. So I think this is something we definitely need to back-patch. The 0002 part is the main part, unifying the definition of reltuples on three main places: a) acquire_sample_rows (ANALYZE) b) lazy_scan_heap (VACUUM) c) IndexBuildHeapRangeScan (CREATE INDEX) As the ANALYZE case seems the most constrained, the other two places were updated to use the same criteria for which rows to include in the reltuples estimate: * HEAPTUPLE_LIVE * HEAPTUPLE_INSERT_IN_PROGRESS (same transaction) * HEAPTUPLE_DELETE_IN_PROGRESS (not the same trasaction) This resolves the issue with oscillating reltuples estimates, produced by VACUUM and ANALYZE (with many non-removable dead tuples). I've checked all IndexBuildHeapRangeScan callers, and none of them is using the reltuples estimate for anything except for passing it to index_update_stats. Aside from the bug fixed in 0001, of course. regards -- Tomas Vondra http://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services --------------CE1D491042EE7CA94899420F Content-Type: application/gzip; name="0001-Compute-index_tuples-correctly-in-bloom-and-spgist.patch.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*0="0001-Compute-index_tuples-correctly-in-bloom-and-spgist.patc"; filename*1="h.gz" H4sICI5qsVoAAzAwMDEtQ29tcHV0ZS1pbmRleF90dXBsZXMtY29ycmVjdGx5LWluLWJsb29t LWFuZC1zcGdpc3QucGF0Y2gA1VZtb9s2EP5s/or71PlFliVZie1kCdq6SRtsGYrae8GKoqAk yuIiixpJNfG6/vcdSTmx06bI1k8zDNmm7473PHf3kOdSrCE5CGd0SuNZdBgkEZ3Es8lBPI6i g3hyyGZBGgT5OM2THC5FBQtWQziBIDiyb4iCICTnGOYIlmJNFfwiqkxS+F6bX0+jKvuzobhQ aT8V61PygmqGpg3z0BUuqcSPcApBeBTMjoIxDIIwCMiiSf5gqT6Ct6+fLeevIBxF72Au1nWj GfAqYzfvdVOXTEEqpETLcoPLkJQC8dAqA1WvuNKELAsGdJ00vMxgzXQhMgW5kJ9ZwjWTDBrF qxVo9JGsbDf4QMuGEcl0IyuWQbKBC7P/cxPyFaP1IqW4sdCFjVvgyjY1E303Vx+zoRq4wtU2 betTU6k5LZ0tUx4kLKWNYnBd8JLtheSKqKauhcJMtACapqKpXBRallDyD84eWvsuX1VCbkHV kmU8xQL0PLJHoipEgwSlolI8Y3Lf2IeF2MvzljvScnebuPVbvU9LqpR/j0JgaJVBUyM8m5AQ UPBVQSQ+NNBctxvP35w9W57BxU8vzn7zCTnnN452muoGQW7AYjYh3L7ZFqxpAFvoFM0Sml65 UpuY+loQJIspte0Cz5ZnW3Asi0uSV0ozmoHIrZ9brKXImtRmQb5Q/C7WKS1MXZXmWIXGVOde M/R8MhwOiaFYS56MLIf4xP2YxNGAvdffMIGBfaGLkunIoEH+Rg7DyPFuP7b+ey4R5NwOR0Gr Fcs8CCNwlhxL3B30cPggYyVzv4c9QjKe5zAcrjiWYvRglsmDf7mGgiwah+xg7PuTfByFYQo4 zYdxbMB/JS7BtL8W++lTGI4n3iEM8DkB/Kk3NctYjozLJtUEOu0L+q4boD/CRcQvO52Mavr2 +Y/zHxa/vzvujPrYH2mBJarpqrXjlT6MOx3bWMcYBW2qZp1gQ5o+uO2ue36DrR9Cd0bHD7m6 PjV7fYLnBp3toIXG8TomQGDUtxinkcE4HXszgzG5NZy3Dd19w0pqauZCemB6cGnxFriXB6iu zRr6tm2VZyJ3OP4BJ27XcyHX1rz7xE6KMgkMT5PSfvHgiYkyPNXvFStzD9ow2NlVU5Y9k+nA APy5RkpZS7RTIEvHbsxbTmBwAuExGWAq6LqUGytcWQYVu0Hp0GxtFj4vSQ5dm/NrXHqWZRdo +EDWu4um1pgwbt3rYZSPltYwnmLXDMKDyJs6Yq3LHZtmUD24T64d9YsqF9Dn268m6CVbC7mZ Y7Mighdmilj3Lgdfr+u5vrFsQUcy1ZQa+e/eCccbt9bvIdyyFGlX8b+YyD+z6GGMYRtheLp7 DJzAdnVPxk/uji0k/EHPL5jcC7OD5q63WzzmHGy3x6VP+8LxOK1KHmfXSso4zmZJPPX92SxO 4jDcl5THRXL68jhbKzZjKzbjL4vNRyRiUb9ERzvB5gphyXLjv3j9ki+W3ym4FvLKHC/2P9fV e60DrlOcV83k0A0UNnotJJUbe1gYu/+uNS7Le2JjEcZWTnEwrNQ4Gr5Na0w6vyJko5QGwzZ9 d9JixzAz7u1Bz3Ded5Va4Mb6Bltvj6HFNddpsRTd3RHfma9vVCN84Hlx9oFhwngDWhVQCZN1 2uDlrNI7RybYSx4ip3XNKiyqhxfG9rhfm/uLC7VCiBSnJ8+xmjjZtvw55WWDl8sMbxKodMnq WnJDAV4QUPPSq1pgac3dh1pz2krWoZOswEkWFuibNMs1gqPqkmlqVLVrLf6FUAX/b6VCvSCR P/MPCPkHK2e6/vgMAAA= --------------CE1D491042EE7CA94899420F Content-Type: application/gzip; name="0002-Unify-the-definition-of-reltuples-in-VACUUM-ANALYZE-.patch.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*0="0002-Unify-the-definition-of-reltuples-in-VACUUM-ANALYZE-.pa"; filename*1="tch.gz" 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 --------------CE1D491042EE7CA94899420F--