Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eIAR3-0000vJ-QJ for pgsql-hackers@arkaria.postgresql.org; Fri, 24 Nov 2017 09:38:14 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eIAR2-00069J-Jp for pgsql-hackers@arkaria.postgresql.org; Fri, 24 Nov 2017 09:38:12 +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.84_2) (envelope-from ) id 1eIAR2-000697-50 for pgsql-hackers@lists.postgresql.org; Fri, 24 Nov 2017 09:38:12 +0000 Received: from mail.postgrespro.ru ([93.174.131.138]) by makus.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1eIAQt-0003vW-To for pgsql-hackers@postgresql.org; Fri, 24 Nov 2017 09:38:10 +0000 Received: from localhost (localhost [127.0.0.1]) by mail.postgrespro.ru (Postfix) with ESMTP id D034B21C1D2A; Fri, 24 Nov 2017 12:38:00 +0300 (MSK) X-Virus-Scanned: Debian amavisd-new at postgrespro.ru Received: from wp.localdomain (gw.postgrespro.ru [93.174.131.141]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 9592721C1692; Fri, 24 Nov 2017 12:38:00 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1511516280; bh=99WHTmT/fCe3gb+mpWDE28Js8Wp5xd4v9mMf9dcjn/U=; h=Date:From:To:Cc:Subject:In-Reply-To:References; b=XKPUSTmV0GGvjRewhh72Lx+J4xLqA7eWxbi5WxlFYXchn5jgA+DvxN2ESWP23IbOc 3EJ9y5q/keaRxSBIiAzUYPFmVxPB9R6XD4v2yhNtaQZOHCRnIdOJJoIKonr8R3MzKv 7tEG3qtWQxJeI9IwYbIvyc9tF2NqCFoXM4HfpKeo= Date: Fri, 24 Nov 2017 12:38:00 +0300 From: Ildus Kurbangaliev To: Tomas Vondra Cc: pgsql-hackers@postgresql.org, Ildar Musin Subject: Re: [HACKERS] Custom compression methods Message-ID: <20171124123800.034c9208@wp.localdomain> In-Reply-To: <57daf28d-ed76-c364-a9ca-65d0ff71a36f@2ndquadrant.com> References: <20170907194236.4cefce96@wp.localdomain> <20170912175505.4afa11fd@wp.localdomain> <20171102152836.60c041e4@wp.localdomain> <20171114162356.52e3d388@wp.localdomain> <62e46a47-08a8-6e06-5e4f-6f52e0a13202@2ndquadrant.com> <20171121174717.69ecd8f4@wp.localdomain> <20171123123849.5a686d7b@wp.localdomain> <57daf28d-ed76-c364-a9ca-65d0ff71a36f@2ndquadrant.com> Organization: Postgres Professional X-Mailer: Claws Mail 3.15.1-dirty (GTK+ 2.24.31; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk On Thu, 23 Nov 2017 21:54:32 +0100 Tomas Vondra wrote: > > Hmm, this seems to have fixed it, but only in one direction. Consider > this: > > create table t_pglz (v text); > create table t_lz4 (v text compressed lz4); > > insert into t_pglz select repeat(md5(i::text),300) > from generate_series(1,100000) s(i); > > insert into t_lz4 select repeat(md5(i::text),300) > from generate_series(1,100000) s(i); > > \d+ > > Schema | Name | Type | Owner | Size | Description > --------+--------+-------+-------+-------+------------- > public | t_lz4 | table | user | 12 MB | > public | t_pglz | table | user | 18 MB | > (2 rows) > > truncate t_pglz; > insert into t_pglz select * from t_lz4; > > \d+ > > Schema | Name | Type | Owner | Size | Description > --------+--------+-------+-------+-------+------------- > public | t_lz4 | table | user | 12 MB | > public | t_pglz | table | user | 18 MB | > (2 rows) > > which is fine. But in the other direction, this happens > > truncate t_lz4; > insert into t_lz4 select * from t_pglz; > > \d+ > List of relations > Schema | Name | Type | Owner | Size | Description > --------+--------+-------+-------+-------+------------- > public | t_lz4 | table | user | 18 MB | > public | t_pglz | table | user | 18 MB | > (2 rows) > > which means the data is still pglz-compressed. That's rather strange, > I guess, and it should compress the data using the compression method > set for the target table instead. That's actually an interesting issue. It happens because if tuple fits to page then postgres just moves it as is. I've just added recompression if it has custom compressed datums to keep dependencies right. But look: create table t1(a text); create table t2(a text); alter table t2 alter column a set storage external; insert into t1 select repeat(md5(i::text),300) from generate_series(1,100000) s(i); \d+ List of relations Schema | Name | Type | Owner | Size | Description --------+------+-------+-------+------------+------------- public | t1 | table | ildus | 18 MB | public | t2 | table | ildus | 8192 bytes | (2 rows) insert into t2 select * from t1; \d+ List of relations Schema | Name | Type | Owner | Size | Description --------+------+-------+-------+-------+------------- public | t1 | table | ildus | 18 MB | public | t2 | table | ildus | 18 MB | (2 rows) That means compressed datums now in the column with storage specified as external. I'm not sure that's a bug or a feature. Lets insert them usual way: delete from t2; insert into t2 select repeat(md5(i::text),300) from generate_series(1,100000) s(i); \d+ List of relations Schema | Name | Type | Owner | Size | Description --------+------+-------+-------+---------+------------- public | t1 | table | ildus | 18 MB | public | t2 | table | ildus | 1011 MB | Maybe there should be more common solution like comparison of attribute properties? -- --- Ildus Kurbangaliev Postgres Professional: http://www.postgrespro.com Russian Postgres Company