Re: query from partitions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



* Richard Huxton <dev@xxxxxxxxxxxx> [2005-12-13 15:59:11 +0000]:

> Ключников А.С. wrote:
> >And
> >select * from base 
> >	where id in (1,2) and datatime between '2005-05-15' and '2005-05-17';
> >10 seconds
> >
> >select * from base
> >	where id in (select id from device where id = 1 or id = 2) and
> >	datatime between '2005-05-15' and '2005-05-17';
> >10 minits
> >
> >Why?
> 
> Run EXPLAIN ANALYSE on both queries to see how the plan has changed.
explain select distinct on(id) * from base where id in (1,2) and
data_type=2 and datatime < '2005-11-02' order by id, datatime desc;

Unique  (cost=10461.14..10527.30 rows=2342 width=38)
   ->  Sort  (cost=10461.14..10494.22 rows=13232 width=38)
         Sort Key: public.base.id, public.base.datatime
         ->  Result  (cost=0.00..9555.29 rows=13232 width=38)
               ->  Append  (cost=0.00..9555.29 rows=13232 width=38)
                     ->  Seq Scan on base  (cost=0.00..32.60 rows=1
width=38)
                           Filter: (((id = 1) OR (id = 2)) AND (data_type =
2) AND (datatime < '2005-11-02 00:00:00'::timestamp without time zone))
                     ->  Seq Scan on base_batch base  (cost=0.00..32.60
rows=1 width=38)
.......................

->  Seq Scan on base_1_2004 base  (cost=0.00..32.60 rows=1 width=38)
                           Filter: (((id = 1) OR (id = 2)) AND (data_type =
2) AND (datatime < '2005-11-02 00:00:00'::timestamp without time zone))
(записей: 34)


and
explain select distinct on(id) * from base where id in (select id from
device where id = 1 or id = 2) and data_type=2 and datatime < '2005-11-02'
order by id, datatime desc;

Unique  (cost=369861.89..369872.52 rows=2126 width=38)
   ->  Sort  (cost=369861.89..369867.21 rows=2126 width=38)
         Sort Key: public.base.id, public.base.datatime
         ->  Hash IN Join  (cost=5.88..369744.39 rows=2126 width=38)
               Hash Cond: ("outer".id = "inner".id)
               ->  Append  (cost=0.00..368654.47 rows=212554 width=38)
                     ->  Seq Scan on base  (cost=0.00..26.95 rows=2
width=38)
                           Filter: ((data_type = 2) AND (datatime <
'2005-11-02 00:00:00'::timestamp without time zone))
                     ->  Seq Scan on base_batch base  (cost=0.00..26.95
rows=2 width=38)
                           Filter: ((data_type = 2) AND (datatime <
'2005-11-02 00:00:00'::timestamp without time zone))
                     ->  Seq Scan on base_lines_05_12 base
(cost=0.00..26.95 rows=2 width=38)
............................
 ->  Hash  (cost=5.88..5.88 rows=2 width=4)
                     ->  Seq Scan on device  (cost=0.00..5.88 rows=2
width=4)
                           Filter: ((id = 1) OR (id = 2))
(записей: 851)

> 
> My guess for why the plans are different is that in the first case your 
> query ends up as ...where (id=1 or id=2)...
> 
> In the second case, the planner doesn't know what it's going to get back 
> from the subquery until it's executed it, so can't tell it just needs to 
> scan base_1,base_2. Result: you'll scan all child tables of base.
> 
> I think the planner will occasionally evaluate constants before 
> planning, but I don't think it will ever execute a subquery and then 
> re-plan the outer query based on those results. Of course, someone might 
> pop up and tell me I'm wrong now...
> 
> -- 
>   Richard Huxton
>   Archonet Ltd
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 9: In versions below 8.0, the planner will ignore your desire to
>       choose an index scan if your joining column's datatypes do not
>       match

-- 
С уважением,
Ключников А.С.
Ведущий инженер ПРП "Аналитприбор"
432030 г.Ульяновск, а/я 3117
тел./факс +7 (8422) 43-44-78
mailto: alexs@xxxxxxxxxxxxxx


[Postgresql General]     [Postgresql PHP]     [PHP Users]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Yosemite]

  Powered by Linux