Optimize question: Why joined query slower far more than two queries?
| От | lt | 
|---|---|
| Тема | Optimize question: Why joined query slower far more than two queries? | 
| Дата | |
| Msg-id | 000c01c032b0$810400d0$3501a8c0@virlthost обсуждение исходный текст | 
| Список | pgsql-admin | 
I am confusing that Postgres 7.0.2 plan for a joined query.
I have tow tables, each contains about 36000 rows. the first tables' structure likes following:
username varchar(20) primary key,
....other columns;
and the 2nd table's structure:
username varchar(20) primary key,
....other columns;
on each table I excute a query to find a user:
   explain select * from users where username='lt';
and the result
   Index Scan using users_username_key on users  (cost=0.00..267.01 rows=306 width=142)  
the 2nd:
   explain select * from wquserdata where username='lt';
result:
   Index Scan using wquserdata_pkey on wquserdata  (cost=0.00..240.80 rows=306 width=48) 
according to that, I expect it should take 267.01+240.80 to join them(btw: why rows=306?)
But the joined query takes far more time than what I expected:
 explain select t0.*,t1.* from wquserdata t0, users t1 where t0.username=t1.username and t0.username='lt';
the result:
Merge Join  (cost=0.00..3033.27 rows=93670 width=190)
  ->  Index Scan using users_username_key on users t1  (cost=0.00..2406.06 rows=30607
width=142)
-> Index Scan using wquserdata_pkey on wquserdata t0 (cost=0.00..240.80 rows=306 width=48)
width=142)
-> Index Scan using wquserdata_pkey on wquserdata t0 (cost=0.00..240.80 rows=306 width=48)
but if I use this:
explain select t0.*,t1.* from wquserdata t0, users t1 where t0.username='lt' and t1.username='lt' and t0.username=t1.username;
the result is exactly what I expected:
Merge Join  (cost=0.00..515.46 rows=937 width=190)
-> Index Scan using users_username_key on users t1 (cost=0.00..267.01 rows=306 width=142)
-> Index Scan using wquserdata_pkey on wquserdata t0 (cost=0.00..240.80 rows=306 width=48)
-> Index Scan using users_username_key on users t1 (cost=0.00..267.01 rows=306 width=142)
-> Index Scan using wquserdata_pkey on wquserdata t0 (cost=0.00..240.80 rows=306 width=48)
I am using a view to select, so the latest query can not be executed in my application. Is there a way to get best performence and can be used in my view?
(my view definition: Create View wqusers as SELECT t0.username, ..., t1.... FROM users t0, wquserdata t1 WHERE (t0.username = t1.username);
and I am performing query like this:
select * from wqusers where username='lt';)
В списке pgsql-admin по дате отправления: