On Tue, Jan 22, 2019 at 1:04 PM Jan Nielsen <jan.sture.niel...@gmail.com>
wrote:

> I just notice that one of my Hibernate JPA SELECTs against my Heroku PG
> 10.4 instance is taking a  l o o o g  to complete
> <https://explain.depesz.com/s/r2GU> as this EXPLAIN (ANALYZE, BUFFERS)
> shows. The database is 591MB running in PG 10.4 on Heroku with the
> following row counts and index use:
>
>
>     relname     | percent_of_times_index_used | rows_in_table
> ----------------+-----------------------------+---------------
> fm_order       | 99                          |       2233237
> fm_grant       | Insufficient data           |        204282
> fm_trader      | 5                           |         89037
> fm_capital     | 99                          |         84267
> fm_session     | 99                          |          7182
> fm_person      | 99                          |          4365
> fm_allocation  | 96                          |          4286
> fm_approval    | Insufficient data           |           920
> fm_market      | 97                          |           583
> fm_account     | 93                          |           451
> fm_marketplace | 22                          |           275
>
>
> and the offending JPA JPQL is:
>
>     @Query("SELECT o FROM Order o WHERE                                "
>          + "       o.type                  = 'LIMIT'                   "
>          + "   AND o.session.original      = :originalSessionId        "
>          + "   AND ( (                                                 "
>          + "         o.consumer IS NULL                                "
>          + "    ) OR (                                                 "
>          + "         o.consumer IS NOT NULL                            "
>          + "     AND o.consumer > 0                                    "
>          + "     AND EXISTS (                                          "
>          + "       SELECT 1 FROM Order oo WHERE                        "
>          + "             oo.id                    = o.consumer         "
>          + "         AND oo.session.original      = :originalSessionId "
>          + "         AND oo.type                  = 'LIMIT'            "
>          + "         AND oo.owner                != o.owner            "
>          + "     )                                                     "
>          + "   )                                                       "
>          + " )                                                         "
>          + " ORDER BY o.lastModifiedDate DESC                          ")
>
>
...which Hibernate converts to:

SELECT order0_.id                 AS id1_7_,
       order0_.created_by         AS created_2_7_,
       order0_.created_date       AS created_3_7_,
       order0_.last_modified_by   AS last_mod4_7_,
       order0_.last_modified_date AS last_mod5_7_,
       order0_.consumer           AS consumer6_7_,
       order0_.market_id          AS market_14_7_,
       order0_.original           AS original7_7_,
       order0_.owner_id           AS owner_i15_7_,
       order0_.owner_target       AS owner_ta8_7_,
       order0_.price              AS price9_7_,
       order0_.session_id         AS session16_7_,
       order0_.side               AS side10_7_,
       order0_.supplier           AS supplie11_7_,
       order0_.type               AS type12_7_,
       order0_.units              AS units13_7_
FROM   fm_order order0_
       CROSS JOIN fm_session session1_
WHERE  order0_.session_id = session1_.id
       AND order0_.type = 'LIMIT'
       AND session1_.original = 7569
       AND ( order0_.consumer IS NULL
              OR ( order0_.consumer IS NOT NULL )
                 AND order0_.consumer > 0
                 AND ( EXISTS (SELECT 1
                               FROM   fm_order order2_
                                      CROSS JOIN fm_session session3_
                               WHERE  order2_.session_id = session3_.id
                                      AND order2_.id = order0_.consumer
                                      AND session3_.original = 7569
                                      AND order2_.type = 'LIMIT'
                                      AND
                     order2_.owner_id <> order0_.owner_id) ) )
ORDER  BY order0_.last_modified_date DESC;




> I'd like get this SELECT to complete in a few milliseconds again instead
> of the several minutes (!) it is now taking. Any ideas what I might try?
>
> Thanks for your time,
>
> Jan
>

Reply via email to