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 1erP97-0003NO-A7 for pgsql-hackers@arkaria.postgresql.org; Thu, 01 Mar 2018 14:25:22 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1erP95-0000Ma-Mg for pgsql-hackers@arkaria.postgresql.org; Thu, 01 Mar 2018 14:25:19 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1erP95-0000Lx-Bp for pgsql-hackers@lists.postgresql.org; Thu, 01 Mar 2018 14:25:19 +0000 Received: from mail.postgrespro.ru ([93.174.131.138]) by magus.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1erP8y-0001Tj-5v for pgsql-hackers@lists.postgresql.org; Thu, 01 Mar 2018 14:25:18 +0000 Received: from localhost (localhost [127.0.0.1]) by mail.postgrespro.ru (Postfix) with ESMTP id 626D921CA0ED; Thu, 1 Mar 2018 17:25:10 +0300 (MSK) X-Virus-Scanned: Debian amavisd-new at postgrespro.ru X-Spam-Flag: NO X-Spam-Score: 0 X-Spam-Level: X-Spam-Status: No, score=x tagged_above=-99 required=4 WHITELISTED tests=[] autolearn=unavailable Received: from [192.168.27.132] (gw.postgrespro.ru [93.174.131.141]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 23BC621CA0EC; Thu, 1 Mar 2018 17:25:10 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1519914310; bh=WIftC1CRqYoP3N+ckhhcMPvMcQHYTwJm0JmsRYoDeAs=; h=Subject:To:Cc:References:From:Date:In-Reply-To; b=HKvzeebHU/wfVE/9xFtwSMHyC5XEvwTU7/yG89wJ3zJ+PwZzLmc2QbnCIGsT6uyXx 8CKoZj9nGvOXs9vSv+iXBuVMBOvcudgYG0MhyHRKO2MdpBDpHbvE8db472PjOoc3eg d0qIpLBRlC6sbuSsvMTRH2GVGy4MC7lDTsa+F/L0= Subject: Re: [patch] BUG #15005: ANALYZE can make pg_class.reltuples inaccurate. To: David Gould Cc: pgsql-hackers@lists.postgresql.org, Alina Alexeeva , Ullas Lakkur Raghavendra References: <20180117164916.3fdcf2e9@engels> <20180228192337.67cc3f99@engels> From: Alexander Kuzmenkov Message-ID: <4988c54a-1709-a978-9a43-65f8a1e09e94@postgrespro.ru> Date: Thu, 1 Mar 2018 17:25:09 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <20180228192337.67cc3f99@engels> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk On 01.03.2018 06:23, David Gould wrote: > In theory the sample pages analyze uses should represent the whole table > fairly well. We rely on this to generate pg_statistic and it is a key > input to the planner. Why should we not believe in it as much only for > reltuples? If the analyze sampling does not work, the fix would be to improve > that, not to disregard it piecemeal. Well, that sounds reasonable. But the problem with the moving average calculation remains. Suppose you run vacuum and not analyze. If the updates are random enough, vacuum won't be able to reclaim all the pages, so the number of pages will grow. Again, we'll have the same thing where the number of pages grows, the real number of live tuples stays constant, and the estimated reltuples grows after each vacuum run. I did some more calculations on paper to try to understand this. If we average reltuples directly, instead of averaging tuple density, it converges like it should. The error with this density calculation seems to be that we're effectively multiplying the old density by the new number of pages. I'm not sure why we even work with tuple density. We could just estimate the number of tuples based on analyze/vacuum, and then apply moving average to it. The calculations would be shorter, too. What do you think? -- Alexander Kuzmenkov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company