Re: Inconsistent use of relpages = -1

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Jeff Davis <pgsql(at)j-davis(dot)com>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: Inconsistent use of relpages = -1
Date: 2024-10-18 19:14:01
Message-ID: 924396.1729278841@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Jeff Davis <pgsql(at)j-davis(dot)com> writes:
> As Corey discovered, and I re-discovered later, partitioned tables can
> have relpages=-1:
> ...
> Another problem is that it's inconsistent: sometimes it's 0 (before
> analyze) and sometimes -1. Views also don't have any storage, but
> relpages are always 0.
> ...
> I don't see any obvious reason that -1 is better than 0, or any code
> that checks for it, so I'm inclined to just use zero instead.

Hmm. relpages = 0 should mean that the relation is (thought to be)
of size zero, which is certainly true for the partitioned table itself,
except that that reasoning should also mean that reltuples is zero.
But we don't do that:

regression=# select relname, relkind, relpages,reltuples from pg_class where relpages < 0;
relname | relkind | relpages | reltuples
----------------+---------+----------+-----------
past_parted | p | -1 | 0
prt1 | p | -1 | 300
pagg_tab | p | -1 | 3000
prt2 | p | -1 | 200
pagg_tab1 | p | -1 | 150
pagg_tab2 | p | -1 | 100
prt1_e | p | -1 | 300
prt2_e | p | -1 | 200
pagg_tab_m | p | -1 | 3000
pagg_tab_ml | p | -1 | 30000
prt1_m | p | -1 | 300
prt2_m | p | -1 | 200
pagg_tab_ml_p2 | p | -1 | 8000
pagg_tab_ml_p3 | p | -1 | 10000
pagg_tab_para | p | -1 | 30000
plt1 | p | -1 | 300
plt2 | p | -1 | 200
plt1_e | p | -1 | 300
pht1 | p | -1 | 300
pht2 | p | -1 | 200
pht1_e | p | -1 | 150
prt1_l | p | -1 | 300
prt1_l_p2 | p | -1 | 125
prt1_l_p3 | p | -1 | 50
prt2_l | p | -1 | 200
prt2_l_p2 | p | -1 | 83
prt2_l_p3 | p | -1 | 33
prt1_n | p | -1 | 250
prt2_n | p | -1 | 300
prt3_n | p | -1 | 0
prt4_n | p | -1 | 300
alpha | p | -1 | 360
alpha_neg | p | -1 | 180
alpha_pos | p | -1 | 180
beta | p | -1 | 360
beta_neg | p | -1 | 180
beta_pos | p | -1 | 180
(37 rows)

If we are going to put data into reltuples but not relpages,
I think I agree with setting relpages to -1 to signify
"unknown" (analogously to -1 for reltuples). Otherwise it
looks like the table has infinite tuple density, which is
likely to bollix something somewhere.

I agree that not documenting this usage is bad, and not being
consistent about it is worse. But I don't think switching
over to the previously-minority case will improve matters.

regards, tom lane

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Dmitry Dolgov 2024-10-18 19:21:19 Changing shared_buffers without restart
Previous Message Jeff Davis 2024-10-18 18:56:08 Inconsistent use of relpages = -1