Got it :-)
thanks !

Marc MILLAS
Senior Architect
+33607850334
www.mokadb.com



On Wed, Mar 24, 2021 at 4:21 AM David G. Johnston <
david.g.johns...@gmail.com> wrote:

> On Tuesday, March 23, 2021, Marc Millas <marc.mil...@mokadb.com> wrote:
>
>> Hi,
>>
>> I cannot agree.
>> I did an explain analyze with and without the cast: its
>> extremely different:
>>
>> postgres=# explain analyze with numb as(select
>> ceiling(2582*random())::int rand, generate_series(1,5) as monnum) select
>> monnum, prenom from numb,prenoms where numb.rand=prenoms.id;
>>                                                          QUERY PLAN
>>
>> -----------------------------------------------------------------------------------------------------------------------------
>>  Nested Loop  (cost=0.33..37.65 rows=5 width=11) (actual
>> time=0.059..0.147 rows=5 loops=1)
>>    CTE numb
>>      ->  ProjectSet  (cost=0.00..0.05 rows=5 width=8) (actual
>> time=0.021..0.022 rows=5 loops=1)
>>            ->  Result  (cost=0.00..0.01 rows=1 width=0) (actual
>> time=0.000..0.000 rows=1 loops=1)
>>    ->  CTE Scan on numb  (cost=0.00..0.10 rows=5 width=8) (actual
>> time=0.023..0.025 rows=5 loops=1)
>>    ->  Index Scan using prenoms_pkey on prenoms  (cost=0.28..7.50 rows=1
>> width=11) (actual time=0.024..0.024 rows=1 loops=5)
>>          Index Cond: (id = numb.rand)
>>  Planning Time: 0.111 ms
>>  Execution Time: 0.201 ms
>> (9 lignes)
>>
>>
>> postgres=# explain analyze with numb as(select ceiling(2582*random())
>> rand, generate_series(1,5) as monnum) select monnum, prenom from
>> numb,prenoms where numb.rand=prenoms.id;
>>                                                   QUERY PLAN
>>
>> ---------------------------------------------------------------------------------------------------------------
>>  Hash Join  (cost=0.21..54.59 rows=65 width=11) (actual time=0.105..0.291
>> rows=5 loops=1)
>>    Hash Cond: ((prenoms.id)::double precision = numb.rand)
>>    CTE numb
>>      ->  ProjectSet  (cost=0.00..0.05 rows=5 width=12) (actual
>> time=0.002..0.003 rows=5 loops=1)
>>            ->  Result  (cost=0.00..0.01 rows=1 width=0) (actual
>> time=0.000..0.000 rows=1 loops=1)
>>    ->  Seq Scan on prenoms  (cost=0.00..40.82 rows=2582 width=11) (actual
>> time=0.011..0.131 rows=2582 loops=1)
>>    ->  Hash  (cost=0.10..0.10 rows=5 width=12) (actual time=0.012..0.012
>> rows=5 loops=1)
>>          Buckets: 1024  Batches: 1  Memory Usage: 9kB
>>          ->  CTE Scan on numb  (cost=0.00..0.10 rows=5 width=12) (actual
>> time=0.004..0.005 rows=5 loops=1)
>>  Planning Time: 0.070 ms
>>  Execution Time: 0.313 ms
>> (11 lignes)
>>
>>
> If I’m reading that correctly since prenoms.id is an integer if you don’t
> cast the ceiling(random) away from double you cannot use the index since
> its not the same type - the integer has to become double, not the reverse.
> So you get a different execution and thus different result ordering since
> the executor doesn’t have to care about row order.
>
> David J.
>
>

Reply via email to