> Obviously this is on toy tables
The query is simplified, yes. But the data in the tables is real, albeit
they're not that large.
> You're misinterpreting it.
I might very well be ;)
But I also get the feeling I didn't explain to you well enough what I meant...
> Without the group by, the plan is a candidate for
nestloop-with-inner-index-scan
Yes, I understand that. I only ditched the group by to check whether the
contraint on the article table was indeed recognized as a constraint on the
package table based on 'article.id = foo.article_id'. And it is/was.
> with the group by, there's another step in the way.
Yep, but on my system, package gets seq-scanned *without* any additional
constraint, resulting in a loooooong processing time.
> Pushing down into subselects does get done, for instance in CVS tip
> I can change the last part of your query to "foo.article_id < 50"
> and get ...
This is why I think I wasn't clear enough.
In the real thing, the constraint on the article table is built by some
external source and I cannot easily make assumptions to translate these to a
constraint on the package table, especially since I expect the planner to be
far better in that than me ;)
So, my base query is this:
select
article.id, p_min
from
article,
(select
article_id, min(amount) as p_min
from
package
group by
article_id
) as foo
where
article.id = foo.article_id and
<some constraint on article table>;
Now, when <constraint> = true, this obviously results in seqscans:
Hash Join (cost=1106.79..1251.46 rows=4452 width=8)
Hash Cond: ("outer".article_id = "inner".id)
-> Subquery Scan foo (cost=726.10..781.74 rows=4451 width=8)
-> HashAggregate (cost=726.10..737.23 rows=4451 width=8)
-> Seq Scan on package (cost=0.00..635.40 rows=18140 width=8)
-> Hash (cost=369.35..369.35 rows=4535 width=4)
-> Seq Scan on article (cost=0.00..369.35 rows=4535 width=4)
But when <constraint> = 'article.id < 50', only article is indexscanned:
Hash Join (cost=730.11..808.02 rows=1 width=8)
Hash Cond: ("outer".article_id = "inner".id)
-> Subquery Scan foo (cost=726.10..781.74 rows=4451 width=8)
-> HashAggregate (cost=726.10..737.23 rows=4451 width=8)
-> Seq Scan on package (cost=0.00..635.40 rows=18140 width=8)
-> Hash (cost=4.01..4.01 rows=1 width=4)
-> Index Scan using article_pkey on article (cost=0.00..4.01 rows=1
width=4)
Index Cond: (id < 50)
Which still results in poor performance due to the seqscan on package.
Putting the constraint on package is boosting performance indeed, but I cannot
make that assumption.
So, what I was asking was:
When the 'article.id < 50' constraint is added, it follows that
'foo.article_id < 50' is a constraint as well. Why is this constraint not
used to avoid the seqscan on package?
> Obviously this is on toy tables, but the point is that the constraint
> does get pushed down through the GROUP BY when appropriate.
I've seen it being pushed down when it already was defined as a constraint on
the group by, like in your example.
If necessary, I'll throw together a few commands that build some example
tables to show what I mean.
--
Best,
Frank.
---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])