postgresql 9.4 with nested "order by" - Mailing list pgsql-bugs

From marc hamelin
Subject postgresql 9.4 with nested "order by"
Date
Msg-id 890651389.23456349.1443610127258.JavaMail.zimbra@univ-fcomte.fr
Whole thread Raw
List pgsql-bugs
Hello,
I have a problem with postgresql and the "ORDER BY".

Centos 7 (new virtual container on proxmox) / Postgresql 9.4 / data import from Postgresql 8.3 without problems

Watch these three SELECT which gives the same result (the second make a list):

1) SELECT MAX(ref_id_trafic) FROM compteur_date WHERE ref_id_trafic IN (SELECT id FROM trafic WHERE ref_id_materiel=15
ORDERBY id); 
2) SELECT ref_id_trafic      FROM compteur_date WHERE ref_id_trafic IN (SELECT id FROM trafic WHERE ref_id_materiel=15
ORDERBY id); 
3) SELECT ref_id_trafic      FROM compteur_date WHERE ref_id_trafic IN (SELECT id FROM trafic WHERE ref_id_materiel=15)
           ORDER BY ref_id_trafic DESC LIMIT 1; 
4) SELECT ref_id_trafic      FROM compteur_date WHERE ref_id_trafic IN (SELECT id FROM trafic WHERE ref_id_materiel=15
ORDERBY id) ORDER BY ref_id_trafic DESC LIMIT 1; 

Indeed, we are not talking about the writing quality of last two
So the explain analyse shows :

1) explain analyse SELECT MAX(ref_id_trafic) FROM compteur_date WHERE ref_id_trafic IN (SELECT id FROM trafic WHERE
ref_id_materiel=15ORDER BY id); 
                                                                          QUERY PLAN
                                      

--------------------------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=80650.71..80650.72 rows=1 width=4) (actual time=196.509..196.509 rows=1 loops=1)
   ->  Nested Loop  (cost=9506.15..80375.80 rows=109963 width=4) (actual time=149.288..192.147 rows=22334 loops=1)
         ->  HashAggregate  (cost=9505.72..9514.44 rows=872 width=4) (actual time=149.163..149.671 rows=859 loops=1)
               Group Key: trafic.id
               ->  Sort  (cost=9492.64..9494.82 rows=872 width=4) (actual time=148.576..148.705 rows=859 loops=1)
                     Sort Key: trafic.id
                     Sort Method: quicksort  Memory: 65kB
                     ->  Seq Scan on trafic  (cost=0.00..9450.05 rows=872 width=4) (actual time=0.065..147.899 rows=859
loops=1)
                           Filter: (ref_id_materiel = 15)
                           Rows Removed by Filter: 526805
         ->  Index Only Scan using ref_id_trafic_indexdate on compteur_date  (cost=0.43..80.00 rows=126 width=4)
(actualtime=0.027..0.041 rows=26 loops=859) 
               Index Cond: (ref_id_trafic = trafic.id)
               Heap Fetches: 22334
 Planning time: 1.812 ms
 Execution time: 196.688 ms
(15 rows)


2) explain analyse SELECT ref_id_trafic FROM compteur_date WHERE ref_id_trafic IN (SELECT id FROM trafic WHERE
ref_id_materiel=15ORDER BY id); 
                                                                       QUERY PLAN
                                

--------------------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=9506.15..80375.80 rows=109963 width=4) (actual time=133.948..167.970 rows=22334 loops=1)
   ->  HashAggregate  (cost=9505.72..9514.44 rows=872 width=4) (actual time=133.893..134.361 rows=859 loops=1)
         Group Key: trafic.id
         ->  Sort  (cost=9492.64..9494.82 rows=872 width=4) (actual time=133.274..133.416 rows=859 loops=1)
               Sort Key: trafic.id
               Sort Method: quicksort  Memory: 65kB
               ->  Seq Scan on trafic  (cost=0.00..9450.05 rows=872 width=4) (actual time=0.038..132.723 rows=859
loops=1)
                     Filter: (ref_id_materiel = 15)
                     Rows Removed by Filter: 526805
   ->  Index Only Scan using ref_id_trafic_indexdate on compteur_date  (cost=0.43..80.00 rows=126 width=4) (actual
time=0.018..0.031rows=26 loops=859) 
         Index Cond: (ref_id_trafic = trafic.id)
         Heap Fetches: 22334
 Planning time: 0.537 ms
 Execution time: 170.422 ms
(14 rows)


3) explain analyse SELECT ref_id_trafic FROM compteur_date WHERE ref_id_trafic IN (SELECT id FROM trafic WHERE
ref_id_materiel=15)ORDER BY ref_id_trafic DESC LIMIT 1; 
                                                                                      QUERY PLAN
                                                              

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.86..64.69 rows=1 width=4) (actual time=16510.462..16510.463 rows=1 loops=1)
   ->  Nested Loop Semi Join  (cost=0.86..7018606.22 rows=109963 width=4) (actual time=16510.457..16510.457 rows=1
loops=1)
         ->  Index Only Scan Backward using ref_id_trafic_indexdate on compteur_date  (cost=0.43..599666.29
rows=14303080width=4) (actual time=0.015..2205.771 rows=3659401 loops=1) 
               Heap Fetches: 3659401
         ->  Index Scan using trafic_pkey on trafic  (cost=0.42..0.45 rows=1 width=4) (actual time=0.003..0.003 rows=0
loops=3659401)
               Index Cond: (id = compteur_date.ref_id_trafic)
               Filter: (ref_id_materiel = 15)
               Rows Removed by Filter: 1
 Planning time: 13.384 ms
 Execution time: 16510.528 ms
(10 rows)


And the last :

4) explain analyse SELECT ref_id_trafic FROM compteur_date WHERE ref_id_trafic IN (SELECT id FROM trafic WHERE
ref_id_materiel=15ORDER BY id) ORDER BY ref_id_trafic DESC LIMIT 1; 
                                                                                      QUERY PLAN
                                                              

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=9483.08..11189.88 rows=1 width=4) (actual time=1723760.031..1723760.032 rows=1 loops=1)
   ->  Nested Loop Semi Join  (cost=9483.08..187457275.03 rows=109824 width=4) (actual time=1723760.028..1723760.028
rows=1loops=1) 
         Join Filter: (compteur_date.ref_id_trafic = trafic.id)
         Rows Removed by Join Filter: 3141947978
         ->  Index Only Scan Backward using ref_id_trafic_indexdate on compteur_date  (cost=0.43..599583.31
rows=14301431width=4) (actual time=0.012..5684.002 rows=3657681 loops=1) 
               Heap Fetches: 3657681
         ->  Materialize  (cost=9482.65..9497.89 rows=871 width=4) (actual time=0.000..0.170 rows=859 loops=3657681)
               ->  Sort  (cost=9482.65..9484.82 rows=871 width=4) (actual time=254.402..254.534 rows=859 loops=1)
                     Sort Key: trafic.id
                     Sort Method: quicksort  Memory: 65kB
                     ->  Seq Scan on trafic  (cost=0.00..9440.11 rows=871 width=4) (actual time=0.026..253.805 rows=859
loops=1)
                           Filter: (ref_id_materiel = 15)
                           Rows Removed by Filter: 526330
 Planning time: 0.627 ms
 Execution time: 1723760.361 ms
(15 rows)

it seems that the double nesting ORDER BY is not properly managed
On the old Postgresql 8.3 no problem detected

Many greetings
Marc Hamelin

pgsql-bugs by date:

Previous
From: 德哥
Date:
Subject: Re: BUG #13651: trigger security invoker attack
Next
From: stormbyte@gmail.com
Date:
Subject: BUG #13655: Incorrect Syntax Error