Обсуждение: [GENERAL] Autoanalyze oddity

Поиск
Список
Период
Сортировка

[GENERAL] Autoanalyze oddity

От
"Peter J. Holzer"
Дата:
This is with PostgreSQL 9.5.6 on Debian Linux.

I noticed that according to pg_stat_user_tables autoanalyze has never
run on a lot of tables. Here is one example:

wdsah=> select * from pg_stat_user_tables where schemaname='public' and relname='facttable_wds_indexstats';
─[ RECORD 1 ]───────┬─────────────────────────
relid               │ 112723
schemaname          │ public
relname             │ facttable_wds_indexstats
seq_scan            │ 569
seq_tup_read        │ 474779212
idx_scan            │ 59184
idx_tup_fetch       │ 59184
n_tup_ins           │ 47128
n_tup_upd           │ 0
n_tup_del           │ 0
n_tup_hot_upd       │ 0
n_live_tup          │ 47128
n_dead_tup          │ 0
n_mod_since_analyze │ 47128
last_vacuum         │ (∅)
last_autovacuum     │ (∅)
last_analyze        │ (∅)
last_autoanalyze    │ (∅)
vacuum_count        │ 0
autovacuum_count    │ 0
analyze_count       │ 0
autoanalyze_count   │ 0

wdsah=> select count(*) from facttable_wds_indexstats;
 count
────────
 857992
(1 row)

So, n_live_tup is way off, and n_tup_ins and n_mod_since_analyze also
seem to be wrong. Looks like this hasn't been updated in a year or so.
But track_counts is on:

wdsah=> show track_counts;
 track_counts
──────────────
 on
(1 row)

And even if it wasn't, shouldn't the autovacuum daemon notice that
n_mod_since_analyze is greater than n_live_tup *
autovacuum_analyze_scale_factor and run an autoanalyze?

But the really weird thing is that pg_stats seems to be reasonably
current: I see entries in most_common_vals which were only inserted in
January. Is it possible that autoanalyze runs without updating
pg_stat_user_tables?

        hp


--
   _  | Peter J. Holzer    | A coding theorist is someone who doesn't
|_|_) |                    | think Alice is crazy.
| |   | hjp@hjp.at         | -- John Gordon
__/   | http://www.hjp.at/ |    http://downlode.org/Etext/alicebob.html

Вложения

Re: [GENERAL] Autoanalyze oddity

От
Adrian Klaver
Дата:
On 03/03/2017 12:33 AM, Peter J. Holzer wrote:
> This is with PostgreSQL 9.5.6 on Debian Linux.
>
> I noticed that according to pg_stat_user_tables autoanalyze has never
> run on a lot of tables. Here is one example:
>
> wdsah=> select * from pg_stat_user_tables where schemaname='public' and relname='facttable_wds_indexstats';
> ─[ RECORD 1 ]───────┬─────────────────────────
> relid               │ 112723
> schemaname          │ public
> relname             │ facttable_wds_indexstats
> seq_scan            │ 569
> seq_tup_read        │ 474779212
> idx_scan            │ 59184
> idx_tup_fetch       │ 59184
> n_tup_ins           │ 47128
> n_tup_upd           │ 0
> n_tup_del           │ 0
> n_tup_hot_upd       │ 0
> n_live_tup          │ 47128
> n_dead_tup          │ 0
> n_mod_since_analyze │ 47128
> last_vacuum         │ (∅)
> last_autovacuum     │ (∅)
> last_analyze        │ (∅)
> last_autoanalyze    │ (∅)
> vacuum_count        │ 0
> autovacuum_count    │ 0
> analyze_count       │ 0
> autoanalyze_count   │ 0
>
> wdsah=> select count(*) from facttable_wds_indexstats;
>  count
> ────────
>  857992
> (1 row)
>
> So, n_live_tup is way off, and n_tup_ins and n_mod_since_analyze also
> seem to be wrong. Looks like this hasn't been updated in a year or so.
> But track_counts is on:
>
> wdsah=> show track_counts;
>  track_counts
> ──────────────
>  on
> (1 row)

What are your settings for autovacuum?:

https://www.postgresql.org/docs/9.5/static/runtime-config-autovacuum.html

Have the storage parameters for the table been altered?:

https://www.postgresql.org/docs/9.5/static/sql-createtable.html#SQL-CREATETABLE-STORAGE-PARAMETERS

>
> And even if it wasn't, shouldn't the autovacuum daemon notice that
> n_mod_since_analyze is greater than n_live_tup *
> autovacuum_analyze_scale_factor and run an autoanalyze?

That value is added to autovacuum_analyze_threshold:

autovacuum_analyze_scale_factor (floating point)

     Specifies a fraction of the table size to add to
autovacuum_analyze_threshold when deciding whether to trigger an
ANALYZE. The default is 0.1 (10% of table size). This parameter can only
be set in the postgresql.conf file or on the server command line; but
the setting can be overridden for individual tables by changing table
storage parameters.

>
> But the really weird thing is that pg_stats seems to be reasonably
> current: I see entries in most_common_vals which were only inserted in
> January. Is it possible that autoanalyze runs without updating
> pg_stat_user_tables?
>
>         hp
>
>


--
Adrian Klaver
adrian.klaver@aklaver.com


Re: [GENERAL] Autoanalyze oddity

От
"Peter J. Holzer"
Дата:
On 2017-03-03 06:39:35 -0800, Adrian Klaver wrote:
> On 03/03/2017 12:33 AM, Peter J. Holzer wrote:
> >This is with PostgreSQL 9.5.6 on Debian Linux.
> >
> >I noticed that according to pg_stat_user_tables autoanalyze has never
> >run on a lot of tables. Here is one example:
> >
> >wdsah=> select * from pg_stat_user_tables where schemaname='public' and relname='facttable_wds_indexstats';
> >─[ RECORD 1 ]───────┬─────────────────────────
[...]
> >n_tup_ins           │ 47128
[...]
> >n_live_tup          │ 47128
> >n_dead_tup          │ 0
> >n_mod_since_analyze │ 47128
> >last_vacuum         │ (∅)
> >last_autovacuum     │ (∅)
> >last_analyze        │ (∅)
> >last_autoanalyze    │ (∅)
> >vacuum_count        │ 0
> >autovacuum_count    │ 0
> >analyze_count       │ 0
> >autoanalyze_count   │ 0
> >
> >wdsah=> select count(*) from facttable_wds_indexstats;
> > count
> >────────
> > 857992
> >(1 row)
> >
> >So, n_live_tup is way off, and n_tup_ins and n_mod_since_analyze also
> >seem to be wrong. Looks like this hasn't been updated in a year or so.
> >But track_counts is on:
> >
> >wdsah=> show track_counts;
> > track_counts
> >──────────────
> > on
> >(1 row)
>
> What are your settings for autovacuum?:
>
> https://www.postgresql.org/docs/9.5/static/runtime-config-autovacuum.html

All the values in the autovacuum section of postgresql.conf are
commented out, so they should be the default values:

Just to be sure here's the output of show for each of the parameters:

wdsah=> show autovacuum;                          on
wdsah=> show log_autovacuum_min_duration;         -1
wdsah=> show autovacuum_max_workers;              3
wdsah=> show autovacuum_naptime;                  1min
wdsah=> show autovacuum_vacuum_threshold;         50
wdsah=> show autovacuum_analyze_threshold;        50
wdsah=> show autovacuum_vacuum_scale_factor;      0.2
wdsah=> show autovacuum_analyze_scale_factor;     0.1
wdsah=> show autovacuum_freeze_max_age;           200000000
wdsah=> show autovacuum_multixact_freeze_max_age; 400000000
wdsah=> show autovacuum_vacuum_cost_delay;        20ms
wdsah=> show autovacuum_vacuum_cost_limit;        -1


> Have the storage parameters for the table been altered?:
>
> https://www.postgresql.org/docs/9.5/static/sql-createtable.html#SQL-CREATETABLE-STORAGE-PARAMETERS

No.

> >And even if it wasn't, shouldn't the autovacuum daemon notice that
> >n_mod_since_analyze is greater than n_live_tup *
> >autovacuum_analyze_scale_factor and run an autoanalyze?
>
> That value is added to autovacuum_analyze_threshold:
>
> autovacuum_analyze_scale_factor (floating point)
>
>     Specifies a fraction of the table size to add to
> autovacuum_analyze_threshold when deciding whether to trigger an ANALYZE.
> The default is 0.1 (10% of table size). This parameter can only be set in
> the postgresql.conf file or on the server command line; but the setting can
> be overridden for individual tables by changing table storage parameters.

True. But 50 is negligible compared to 47128*0.1. So that shouldn't make
much of a difference.

But now that I look closer, I notice that the number in n_tup_ins for
that table is exactly the number of records inserted since
2017-02-08T13:00 and there were no records inserted between 09:00 and
13:00 on that day.

So it is likely that something happened on that day (disk full?) which
wiped out the contents of pg_stat_user_tables.

Looking into the source code, I find that
reltuples = classForm->reltuples;
Am I correct to assume that this is pg_class.reltuples? That would
explain why analyze hasn't run yet: This is 862378, which is exactly
correct. 862378 * 0.1 + 50 is 86287.8, which is larger than
pg_stat_user_tables.n_mod_since_analyze. At the current rate of inserts,
this threshold will be reached on March 24nd. I'll check whether the
table is analyzed then.

        hp


--
   _  | Peter J. Holzer    | A coding theorist is someone who doesn't
|_|_) |                    | think Alice is crazy.
| |   | hjp@hjp.at         | -- John Gordon
__/   | http://www.hjp.at/ |    http://downlode.org/Etext/alicebob.html

Вложения

Re: [GENERAL] Autoanalyze oddity

От
Adrian Klaver
Дата:
On 03/05/2017 03:01 AM, Peter J. Holzer wrote:
> On 2017-03-03 06:39:35 -0800, Adrian Klaver wrote:
>> On 03/03/2017 12:33 AM, Peter J. Holzer wrote:
>>> This is with PostgreSQL 9.5.6 on Debian Linux.
>>>
>>> I noticed that according to pg_stat_user_tables autoanalyze has never
>>> run on a lot of tables. Here is one example:
>>>
>>> wdsah=> select * from pg_stat_user_tables where schemaname='public' and relname='facttable_wds_indexstats';
>>> ─[ RECORD 1 ]───────┬─────────────────────────
> [...]
>>> n_tup_ins           │ 47128
> [...]
>>> n_live_tup          │ 47128
>>> n_dead_tup          │ 0
>>> n_mod_since_analyze │ 47128
>>> last_vacuum         │ (∅)
>>> last_autovacuum     │ (∅)
>>> last_analyze        │ (∅)
>>> last_autoanalyze    │ (∅)
>>> vacuum_count        │ 0
>>> autovacuum_count    │ 0
>>> analyze_count       │ 0
>>> autoanalyze_count   │ 0
>>>
>>> wdsah=> select count(*) from facttable_wds_indexstats;
>>> count
>>> ────────
>>> 857992
>>> (1 row)
>>>
>>> So, n_live_tup is way off, and n_tup_ins and n_mod_since_analyze also
>>> seem to be wrong. Looks like this hasn't been updated in a year or so.
>>> But track_counts is on:
>>>
>>> wdsah=> show track_counts;
>>> track_counts
>>> ──────────────
>>> on
>>> (1 row)
>>
>> What are your settings for autovacuum?:
>>
>> https://www.postgresql.org/docs/9.5/static/runtime-config-autovacuum.html
>
> All the values in the autovacuum section of postgresql.conf are
> commented out, so they should be the default values:
>
> Just to be sure here's the output of show for each of the parameters:
>
> wdsah=> show autovacuum;                          on
> wdsah=> show log_autovacuum_min_duration;         -1
> wdsah=> show autovacuum_max_workers;              3
> wdsah=> show autovacuum_naptime;                  1min
> wdsah=> show autovacuum_vacuum_threshold;         50
> wdsah=> show autovacuum_analyze_threshold;        50
> wdsah=> show autovacuum_vacuum_scale_factor;      0.2
> wdsah=> show autovacuum_analyze_scale_factor;     0.1
> wdsah=> show autovacuum_freeze_max_age;           200000000
> wdsah=> show autovacuum_multixact_freeze_max_age; 400000000
> wdsah=> show autovacuum_vacuum_cost_delay;        20ms
> wdsah=> show autovacuum_vacuum_cost_limit;        -1
>
>
>> Have the storage parameters for the table been altered?:
>>
>> https://www.postgresql.org/docs/9.5/static/sql-createtable.html#SQL-CREATETABLE-STORAGE-PARAMETERS
>
> No.
>
>>> And even if it wasn't, shouldn't the autovacuum daemon notice that
>>> n_mod_since_analyze is greater than n_live_tup *
>>> autovacuum_analyze_scale_factor and run an autoanalyze?
>>
>> That value is added to autovacuum_analyze_threshold:
>>
>> autovacuum_analyze_scale_factor (floating point)
>>
>>     Specifies a fraction of the table size to add to
>> autovacuum_analyze_threshold when deciding whether to trigger an ANALYZE.
>> The default is 0.1 (10% of table size). This parameter can only be set in
>> the postgresql.conf file or on the server command line; but the setting can
>> be overridden for individual tables by changing table storage parameters.
>
> True. But 50 is negligible compared to 47128*0.1. So that shouldn't make
> much of a difference.
>
> But now that I look closer, I notice that the number in n_tup_ins for
> that table is exactly the number of records inserted since
> 2017-02-08T13:00 and there were no records inserted between 09:00 and
> 13:00 on that day.

Are you getting the above from querying the records themselves?

>
> So it is likely that something happened on that day (disk full?) which
> wiped out the contents of pg_stat_user_tables.

Are there any logs from that time, either Postgres or system?

I would think a full disk would have been noticed at the time so
alternate theories:

https://www.postgresql.org/docs/9.5/static/monitoring-stats.html

"...  When the server shuts down cleanly, a permanent copy of the
statistics data is stored in the pg_stat subdirectory, so that
statistics can be retained across server restarts. When recovery is
performed at server start (e.g. after immediate shutdown, server crash,
and point-in-time recovery), all statistics counters are reset.
..."

Or:

Table 27-16. Additional Statistics Functions

pg_stat_reset*

>
> Looking into the source code, I find that
> reltuples = classForm->reltuples;
> Am I correct to assume that this is pg_class.reltuples? That would
> explain why analyze hasn't run yet: This is 862378, which is exactly
> correct. 862378 * 0.1 + 50 is 86287.8, which is larger than
> pg_stat_user_tables.n_mod_since_analyze. At the current rate of inserts,
> this threshold will be reached on March 24nd. I'll check whether the
> table is analyzed then.
>
>         hp
>
>


--
Adrian Klaver
adrian.klaver@aklaver.com


Re: [GENERAL] Autoanalyze oddity

От
"Peter J. Holzer"
Дата:
On 2017-03-05 08:39:05 -0800, Adrian Klaver wrote:
> On 03/05/2017 03:01 AM, Peter J. Holzer wrote:
> >So it is likely that something happened on that day (disk full?) which
> >wiped out the contents of pg_stat_user_tables.
>
> Are there any logs from that time, either Postgres or system?
>
> I would think a full disk would have been noticed at the time so alternate
> theories:
>
> https://www.postgresql.org/docs/9.5/static/monitoring-stats.html
>
> "...  When the server shuts down cleanly, a permanent copy of the statistics
> data is stored in the pg_stat subdirectory, so that statistics can be
> retained across server restarts. When recovery is performed at server start
> (e.g. after immediate shutdown, server crash, and point-in-time recovery),
> all statistics counters are reset.
> ..."

Oh, of course. That was the day we found out the hard way that the
bypass for the UPS didn't work. I knew that date looked familiar, but
somehow couldn't place it. Mystery solved, thanks!

        hp


--
   _  | Peter J. Holzer    | A coding theorist is someone who doesn't
|_|_) |                    | think Alice is crazy.
| |   | hjp@hjp.at         | -- John Gordon
__/   | http://www.hjp.at/ |    http://downlode.org/Etext/alicebob.html

Вложения

Re: [GENERAL] Autoanalyze oddity

От
"Peter J. Holzer"
Дата:
On 2017-03-05 12:01:07 +0100, Peter J. Holzer wrote:
[...]
> At the current rate of inserts, this threshold will be reached on
> March 24nd. I'll check whether the table is analyzed then.

It was (a little earlier than expected because pg_class.reltuples didn't
increase in the meantime).

        hp


--
   _  | Peter J. Holzer    | A coding theorist is someone who doesn't
|_|_) |                    | think Alice is crazy.
| |   | hjp@hjp.at         | -- John Gordon
__/   | http://www.hjp.at/ |    http://downlode.org/Etext/alicebob.html

Вложения