Re: Performance killed with FDW when using CAST.

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

 





On 4/16/19 9:40 PM, Jorge Torralba wrote:
Thanks for taking the time to look.

Both servers are on ....

   version
----------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 11.2 (Debian 11.2-1.pgdg90+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit

I have reduced the query to select only two columns for simplicity with the same results.

The table contain about 50 million rows

On the server hosting the table ..... Hiding private data.

alertsdb_recent_events=#  select id, attributes -> 'account_incident_id' from recent_events where account_id = 1 AND (attributes -> 'account_incident_id')::integer = 2617116 limit 5;
                  id                  | ?column?
--------------------------------------+----------
 ***** | 2617116
 ***** | 2617116
 ***** | 2617116
 ***** | 2617116
 ***** | 2617116
(5 rows)

Time: 82.868 ms


# explain  select id, attributes -> 'account_incident_id' from recent_events where account_id = 1 AND (attributes -> 'account_incident_id')::integer = 2617116 limit 5;
     QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.56..3.77 rows=5 width=48)
   ->  Index Scan using recent_event_account_id_attributes_account_incident_id_idx on recent_events  (cost=0.56..56.31 rows=87 width=48)          Index Cond: ((account_id = 1) AND (((attributes -> 'account_incident_id'::text))::integer = 2617116))
(3 rows)

Time: 71.907 ms

# explain  analyze select id, attributes -> 'account_incident_id' from recent_events where account_id = 1 AND (attributes -> 'account_incident_id')::integer = 2617116 limit 5;
                          QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.56..3.77 rows=5 width=48) (actual time=0.019..0.025 rows=5 loops=1)    ->  Index Scan using recent_event_account_id_attributes_account_incident_id_idx on recent_events  (cost=0.56..56.31 rows=87 width=48) (actual time=0.018..0.023 rows=5 loops=1)          Index Cond: ((account_id = 1) AND (((attributes -> 'account_incident_id'::text))::integer = 2617116))
 Planning Time: 0.124 ms
 Execution Time: 0.038 ms
(5 rows)

Time: 80.782 ms


On the server that communicates with the FDW server .....

# explain  select id, attributes -> 'account_incident_id' from recent_events where account_id = 1 AND (attributes -> 'account_incident_id')::integer = 2617116 limit 5;
                                     QUERY PLAN
-------------------------------------------------------------------------------------
 Limit  (cost=100.00..426.27 rows=5 width=48)
   ->  Foreign Scan on recent_events (cost=100.00..6663659.61 rows=102117 width=48)          Filter: (((attributes -> 'account_incident_id'::text))::integer = 2617116)
(3 rows)

Time: 85.276 ms


# explain  analyze select id, attributes -> 'account_incident_id' from recent_events where account_id = 1 AND (attributes -> 'account_incident_id')::integer = 2617116 limit 5;
    QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=100.00..426.27 rows=5 width=48) (actual time=21242.087..26387.257 rows=5 loops=1)    ->  Foreign Scan on recent_events (cost=100.00..6663703.90 rows=102117 width=48) (actual time=21242.086..26387.252 rows=5 loops=1)          Filter: (((attributes -> 'account_incident_id'::text))::integer = 2617116)
         Rows Removed by Filter: 724249
 Planning Time: 1.164 ms
 Execution Time: 26387.851 ms
(6 rows)

Time: 26528.113 ms (00:26.528)

The query killer is the ...

AND (attributes -> 'account_incident_id')::integer = 2617116

Run the query this way ...

select id, attributes -> 'account_incident_id' from recent_events where account_id = 1  limit 5;

and the results is only 10ms slower than on the hosting server directly which is what we are expecting.  It's like the casting of the hstore column is just not playing nice.

Casting the left side of a predicate is not recommended.  What if you cast 2617166 to be the same type as attributes -> 'account_incident_id'?


--
Angular momentum makes the world go 'round.





[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux