Greenstand / treetracker-admin-api

Legacy API microservice for the admin panel
GNU Affero General Public License v3.0
31 stars 81 forks source link

Try to use new SQL to query tree list filtered by organization #658

Open dadiorchen opened 1 year ago

dadiorchen commented 1 year ago

Currently the query: https://prod-k8s.treetracker.org/api/admin/api/trees?filter={%22where%22:{%22approved%22:false,%22active%22:true,%22organizationId%22:194,%22stakeholderUUID%22:%2235e1c708-267b-4dd9-84be-868a954b0807%22},%22order%22:[%22id%20desc%22],%22limit%22:24,%22skip%22:240,%22fields%22:{%22uuid%22:true,%22imageUrl%22:true,%22lat%22:true,%22lon%22:true,%22id%22:true,%22timeCreated%22:true,%22timeUpdated%22:true,%22active%22:true,%22approved%22:true,%22planterId%22:true,%22deviceIdentifier%22:true,%22planterIdentifier%22:true,%22speciesId%22:true,%22tokenId%22:true,%22morphology%22:true,%22age%22:true,%22captureApprovalTag%22:true,%22rejectionReason%22:true,%22note%22:true}} is slow, the explanation and execution of the SQL:

treetracker=> explain select * from trees
treetracker-> where
treetracker-> (
treetracker(>   planting_organization_id in (select entity_id from getEntityRelationshipChildren(194))
treetracker(> )
treetracker-> order by id desc
treetracker-> limit 96
treetracker-> offset 1000;
                                                 QUERY PLAN
-------------------------------------------------------------------------------------------------------------
 Limit  (cost=331855.11..363711.94 rows=96 width=917)
   ->  Nested Loop  (cost=13.18..101083046.49 rows=304612 width=917)
         Join Filter: (trees.planting_organization_id = getentityrelationshipchildren.entity_id)
         ->  Index Scan Backward using trees_id_pkey on trees  (cost=0.43..732516.99 rows=5882438 width=917)
         ->  HashAggregate  (cost=12.75..14.75 rows=200 width=4)
               Group Key: getentityrelationshipchildren.entity_id
               ->  Function Scan on getentityrelationshipchildren  (cost=0.25..10.25 rows=1000 width=4)
(7 rows)

Time: 2.154 ms
treetracker=> select * from trees
treetracker-> where
treetracker-> (
treetracker(>   planting_organization_id in (select entity_id from getEntityRelationshipChildren(194))
treetracker(> )
treetracker-> order by id desc
treetracker-> limit 96
treetracker-> offset 1000;
treetracker=>
treetracker=>
treetracker=> select * from trees
treetracker-> where
treetracker-> (
treetracker(>   planting_organization_id in (select entity_id from getEntityRelationshipChildren(194))
treetracker(> )
treetracker-> order by id desc
treetracker-> limit 2
treetracker-> offset 1000;
   id   |    time_created     |    time_updated     | missing | priority | cause_of_death_id | planter_id | primary_location_
id | settings_id | override_settings_id | dead | photo_id |
                                 image_url
                 | certificate_id |            estimated_geometric_location            |        lat         |        lon
    | gps_accuracy | active | planter_photo_url | planter_identifier | device_id | sequence | note | verified |
   uuid                 | approved | status  | cluster_regions_assigned | species_id | planting_organization_id | payment_id
| contract_id | token_issued | morphology |   age    | species | capture_approval_tag | rejection_reason | matching_hash | de
vice_identifier | images | domain_specific_data | image_url_backup |               token_id               | name | earnings_i
d |              session_id
--------+---------------------+---------------------+---------+----------+-------------------+------------+------------------
---+-------------+----------------------+------+----------+------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------
-----------------+----------------+----------------------------------------------------+--------------------+----------------
----+--------------+--------+-------------------+--------------------+-----------+----------+------+----------+--------------
------------------------+----------+---------+--------------------------+------------+--------------------------+------------
+-------------+--------------+------------+----------+---------+----------------------+------------------+---------------+---
----------------+--------+----------------------+------------------+--------------------------------------+------+-----------
--+--------------------------------------
 472791 | 2020-11-27 14:28:33 | 2020-11-27 14:28:33 | f       | f        |                   |       3272 |
   |             |                      |    0 |          | https://treetracker-production-images.s3.eu-central-1.amazonaws.c
om/2020.11.29.12.35.24_18.28512164298445_-73.56352591887116_b37c4484-c427-4ba4-a38e-a810e9c71b38_IMG_20201127_092832_29320605
89995952190.jpg  |                | 0101000020E6100000000004CF106452C0000064BBFD483240 |  18.28512164298445 | -73.56352591887
116 |            9 | t      |                   | 46964146           |           |          |      | f        | 1e185606-1279
-4383-8816-c39f8d6d8d07 | t        | planted | t                        |        331 |                      194 |
|             | f            | seedling   | new_tree |         | fruit                |                  |               | bd
b06f0ac235df94  | {}     | {}                   |                  | 1729897b-5e53-4fd4-9742-19b55c792f7e |      |
  | cd2e2d3f-2f6a-5abd-b2ae-2fd6cf3a101b
 472790 | 2020-11-27 14:28:05 | 2020-11-27 14:28:05 | f       | f        |                   |       3272 |
   |             |                      |    0 |          | https://treetracker-production-images.s3.eu-central-1.amazonaws.c
om/2020.11.29.12.35.21_18.285042098723352_-73.56351166963577_d03aff17-54df-436f-b321-a6132227708b_IMG_20201127_092804_4411297
485046996398.jpg |                | 0101000020E610000000004093106452C00000DC84F8483240 | 18.285042098723352 | -73.56351166963
577 |            6 | t      |                   | 46964146           |           |          |      | f        | 9afafad7-a382
-4fa7-bb2d-8f3a4deb4105 | t        | planted | t                        |        331 |                      194 |
|             | f            | seedling   | new_tree |         | fruit                |                  |               | bd
b06f0ac235df94  | {}     | {}                   |                  | 2f415bb2-8f11-4ac5-83f0-ee0b77fbfc76 |      |
  | cd2e2d3f-2f6a-5abd-b2ae-2fd6cf3a101b
(2 rows)

Time: 170853.592 ms (02:50.854)

Seems the function is a reason to trigger id scan, in the web map case, the SQL below is in a better result, maybe we can use this to speed up the admin panel:

treetracker=> WITH RECURSIVE organization_children AS (
treetracker(>            SELECT entity.id, entity_relationship.parent_id, 1 as depth, entity_relationship.type, entity_relati
onship.role
treetracker(>            FROM entity
treetracker(>            LEFT JOIN entity_relationship ON entity_relationship.child_id = entity.id
treetracker(>            WHERE entity.id = 194
treetracker(>           UNION
treetracker(>            SELECT next_child.id, entity_relationship.parent_id, depth + 1, entity_relationship.type, entity_rel
ationship.role
treetracker(>            FROM entity next_child
treetracker(>            JOIN entity_relationship ON entity_relationship.child_id = next_child.id
treetracker(>            JOIN organization_children c ON entity_relationship.parent_id = c.id
treetracker(>           )
treetracker->             ,org_tree_id AS (
treetracker(>               SELECT id FROM (
treetracker(>               SELECT trees.id as id from trees
treetracker(>                 WHERE
treetracker(>                   planter_id IN (
treetracker(>                     SELECT id FROM planter
treetracker(>                     JOIN (
treetracker(>                       SELECT id AS entity_id FROM organization_children LIMIT 20
treetracker(>                     ) org ON planter.organization_id = org.entity_id
treetracker(>                   )
treetracker(>               UNION
treetracker(>                 select id from trees where planting_organization_id = (
treetracker(>                   194
treetracker(>                 )
treetracker(>               ) ids
treetracker(>
treetracker(>             )
treetracker-> select * from trees
treetracker-> where
treetracker-> (
treetracker(>   id in (select id from org_tree_id)
treetracker(> )
treetracker-> order by id desc
treetracker-> limit 2
treetracker-> offset 1000;

   id    |    time_created     |    time_updated     | missing | priority | cause_of_death_id | planter_id | primary_location
_id | settings_id | override_settings_id | dead | photo_id |
                                  image_url
                 | certificate_id |            estimated_geometric_location            |        lat         |        lon
    | gps_accuracy | active |                                                                                               p
lanter_photo_url                                                                                               | planter_iden
tifier | device_id | sequence | note | verified |                 uuid                 | approved | status  | cluster_regions
_assigned | species_id | planting_organization_id | payment_id | contract_id | token_issued | morphology | age | species | ca
pture_approval_tag | rejection_reason | matching_hash | device_identifier | images | domain_specific_data | image_url_backup
| token_id | name | earnings_id | session_id
---------+---------------------+---------------------+---------+----------+-------------------+------------+-----------------
----+-------------+----------------------+------+----------+-----------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------
-----------------+----------------+----------------------------------------------------+--------------------+----------------
----+--------------+--------+------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------+-------------
-------+-----------+----------+------+----------+--------------------------------------+----------+---------+----------------
----------+------------+--------------------------+------------+-------------+--------------+------------+-----+---------+---
-------------------+------------------+---------------+-------------------+--------+----------------------+------------------
+----------+------+-------------+------------
 3673267 | 2022-11-23 12:10:08 | 2022-11-23 12:10:08 | f       | f        |                   |       5865 |
    |             |                      |    0 |          | https://treetracker-production-images.s3.eu-central-1.amazonaws.
com/2022.11.23.11.36.42_18.295119434595108_-73.5591351930052_9344a485-d119-46d3-9912-3fdc38942e45_IMG_20221123_071006_5287675
375067452884.jpg |                | 0101000020E61000000000FADEC86352C0000080F28C4B3240 | 18.295119434595108 |  -73.5591351930
052 |              | t      | https://treetracker-production-images.s3.eu-central-1.amazonaws.com/2022.05.15.08.33.25_18.2946
49268500507_-73.55373761616647_9b26ff3c-b2b0-418a-87ba-93b9620c06e4_IMG_20220512_075859_334598811520482040.jpg | 44882359
       |           |          |      | f        | b22facc9-09d9-4c64-ab68-229981dbd8c1 | f        | planted | t
          |            |                          |            |             | f            |            |     |         |
                   |                  |               | cf1616c5c72ce3c9  |        |                      |
|          |      |             |
 3673266 | 2022-11-23 12:09:56 | 2022-11-23 12:09:56 | f       | f        |                   |       5865 |
    |             |                      |    0 |          | https://treetracker-production-images.s3.eu-central-1.amazonaws.
com/2022.11.23.11.36.40_18.29509348422289_-73.55913235992193_838c8544-4ee7-4211-a8aa-9e376a9df216_IMG_20221123_070952_2436247
732041458036.jpg |                | 0101000020E6100000000018D3C86352C00000203F8B4B3240 |  18.29509348422289 | -73.55913235992
193 |              | t      | https://treetracker-production-images.s3.eu-central-1.amazonaws.com/2022.05.15.08.33.25_18.2946
49268500507_-73.55373761616647_9b26ff3c-b2b0-418a-87ba-93b9620c06e4_IMG_20220512_075859_334598811520482040.jpg | 44882359
       |           |          |      | f        | b6a33ce1-4a78-4b03-9957-6480114fe934 | f        | planted | t
          |            |                          |            |             | f            |            |     |         |
                   |                  |               | cf1616c5c72ce3c9  |        |                      |
|          |      |             |
(2 rows)

Time: 65904.394 ms (01:05.904)