Re: Stopgap solution for table-size-estimate updating - Mailing list pgsql-hackers
From | Simon Riggs |
---|---|
Subject | Re: Stopgap solution for table-size-estimate updating |
Date | |
Msg-id | 1101593804.2870.2514.camel@localhost.localdomain Whole thread Raw |
In response to | Re: Stopgap solution for table-size-estimate updating problem (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: Stopgap solution for table-size-estimate updating problem
|
List | pgsql-hackers |
On Sat, 2004-11-27 at 00:54, Tom Lane wrote: > "Zeugswetter Andreas DAZ SD" <ZeugswetterA@spardat.at> writes: > >> rel->pages = RelationGetNumberOfBlocks(relation); > > > Is RelationGetNumberOfBlocks cheap enough that you can easily use it for the > > optimizer ? > > It's basically going to cost one extra lseek() kernel call ... per > query, per table referenced in the query. I no longer think this is > a killer argument. lseek isn't going to induce any I/O, so it should > be cheap as kernel calls go. > OK, didn't believe it at first, but it is just one call, since md.c's mdnblocks() is already optimized to avoid O(N) behaviour in terms of kernel calls. Cool. > > I myself have always preferred more stable estimates that only change > > when told to. I never liked that vacuum (without analyze) and create index > > change those values, imho only analyze should. > > Indeed, this is probably the most significant argument in favor of > leaving things as they are. But the other side of the coin is: why > shouldn't a bunch of inserts or updates cause the plan to change? > The people who are complaining about it have certainly posted plenty > of examples where it would help to change the plans. > ISTM that you both have good arguments. Andreas' argument is what most people expect to happen, if they come from other commercial RDBMS. This was my starting place, though upon reflection I think Tom's proposal seems to be the way of the future, even if it does seem now to be a more dynamic approach with less direct control for the DBA. If we look at this from the perspective of how many people will post problems about this issue, I'd say this late in the beta cycle there's a big risk that it will cause much grief. However, the issue already does cause much grief to those who don't manage it well (as Richard Huxton points out on a previous thread today). There doesn't seem any benefit in staying where we are today apart for those few who already precisely and accurately control statistics collection. Andreas called for a GUC to control that behaviour. Given that the more dynamic behaviour suggested needs to be turned on by default, it does seem reasonable to have a GUC that allows you to turn it off. There may be other side effects discovered later that require more manual control and it would make sense at that point to have a switch to turn it off if not required. So, I vote in favour of the new dynamic estimation method to be added to 8.0, on by default, but with a GUC to turn off if problems arise. ... enable_dynamic_statistics=true If it holds good, like I'm sure it will then this can be deprecated later. Many other aspects of statistics collection can occur dynamically also, such as post-execution cardinality statistics. Or perhaps some_default_estimate was itself a GUC, that would turn off this feature off when it was set to 0...? If not, what value is proposed? On the topic of accuracy of the estimate: Updates cause additional data to be written to the table, so tables get bigger until vacuumed. Tables with many Inserts are also regularly trimmed with Deletes. With a relatively static workload and a regular vacuum cycle, the table size for many major tables eventually levels off, remaining roughly constant but the number of non-zero pages will vary over time in a saw-tooth curve. Estimating the cardinality by using the number of blocks would ignore the fact that many of them are empty for much of the time. That would then lead to a systematic over-estimate of the cardinality of the regularly updated tables. You have to take the estimate from somewhere, but I note that current practice of using a VACUUM ANALYZE would mean that the statistics would be collected when free space in the table was highest. That estimate would differ from the dynamic method suggested since this would lead to a calculation equivalent to the taking an ANALYZE immediately before a VACUUM, rather than after it. How easy would it be to take into account the length of the FSM for the relation also? [...IIRC DB2 has a VOLATILE option at table level, which enables dynamic estimation of statistics.] -- Best Regards, Simon Riggs
pgsql-hackers by date: