Re: IN list processing performance (yet again)
От | Dave Tenny |
---|---|
Тема | Re: IN list processing performance (yet again) |
Дата | |
Msg-id | 3ED5603C.2020800@attbi.com обсуждение исходный текст |
Ответ на | Re: IN list processing performance (yet again) (Tom Lane <tgl@sss.pgh.pa.us>) |
Ответы |
Re: IN list processing performance (yet again)
Re: IN list processing performance (yet again) |
Список | pgsql-performance |
Tom Lane wrote:
Does that mean that the time for the O(1) portions of the logic are perhaps also in need of a tuneup?
(I would think O(N^2) for trivial operations on a fast machine wouldn't manifest quite so much
for smallish N).
I'm afraid I'm not up to testing CVS tips.
parameterized statements were successfully using the index of the freshly-created-but-unanalyzed table,
or else the times on those queries would have been terrible too. It was only the IN list form
of query that wasn't making correct use of the index. How can the planner recognize uniqueness for
one case but not the other? (Since I ran both forms of query on the same table with and without vacuuming).
Dave
It was also showing up very clearly in the timings I attached for just a couple hundred IN list entries too.Dave Tenny <tenny@attbi.com> writes:My application relies heavily on IN lists. The lists are primarily constant integers, so queries look like: SELECT val FROM table WHERE id IN (43, 49, 1001, 100002, ...)1) PostgreSQL exhibits worse-than-linear performance behavior with respect to IN list size.Yeah. There are a couple of places in the planner that have O(N^2) behavior on sufficiently large WHERE clauses, due to building lists in a naive way (repeated lappend() operations). The inner loop is very tight, but nonetheless when you do it tens of millions of times it adds up :-(
Does that mean that the time for the O(1) portions of the logic are perhaps also in need of a tuneup?
(I would think O(N^2) for trivial operations on a fast machine wouldn't manifest quite so much
for smallish N).
So what version might that equate to down the road, so I can be sure to check it out?I have just committed some fixes into CVS tip for this --- I see about a 10x speedup in planning time on test cases involving 10000-OR-item WHERE clauses. We looked at this once before; the test cases I'm using actually date back to Jan 2000. But it seems some slowness has crept in due to subsequent planning improvements.
I'm afraid I'm not up to testing CVS tips.
There is one very interesting thing in my test case though. It certainly seemed as if the4) God help you if you haven't vacuum/analyzed that the newly loaded table.Without knowledge that the id field is unique, the planner is likely to tilt away from an indexscan with not too many IN items. I don't consider this a bug.
parameterized statements were successfully using the index of the freshly-created-but-unanalyzed table,
or else the times on those queries would have been terrible too. It was only the IN list form
of query that wasn't making correct use of the index. How can the planner recognize uniqueness for
one case but not the other? (Since I ran both forms of query on the same table with and without vacuuming).
Thanks, that's good to know.PostgreSQL craps out trying to process 8000 elements with the error: out of free buffers: time to abort!This is a known bug in 7.3.2; it's fixed in 7.3.3.
Dave
В списке pgsql-performance по дате отправления: