Hi Michael ,

We tried dropping the below values from the function, but it did not help.

Also, the values PAID and MANUALLY PAID constitutes about 60 % of the values in 
table ,  and infact we tried creating the partial index and it did not help.

The Strange thing is that we are trying to run this in oracle as we have done 
the migration recently and it is running in less than second with same indexes 
and other database objects . I can understand that comparing to oracle is 
stupidity, but this is only thing where we can compare.

Below is the query we are running on oracle and comparing in postgres

Below is the query and plan for same

https://explain.depesz.com/s/wktl#stats<https://urldefense.com/v3/__https:/explain.depesz.com/s/wktl*stats__;Iw!!KupS4sW4BlfImQPd!OE7VRYuxv81xKZski81jR9U-OFWiC5_KPW02j0u9iHLcaEbtUo5u_sIfi8VFrToyBiI2A_69MqYrJe97dsUq$>

Any help would be appreciated.



Thanks and Regards,
Mukesh Kumar

From: Michel SALAIS <msal...@msym.fr>
Sent: Thursday, April 14, 2022 11:45 PM
To: Kumar, Mukesh <mku...@peabodyenergy.com>; 'Ranier Vilela' 
<ranier...@gmail.com>
Cc: pgsql-performa...@postgresql.org; 'MUKESH KUMAR' <mukesh.kuma...@tcs.com>
Subject: RE: Query Tunning related to function

Hi,

This part of the function is odd and must be dropped:
         IF (ret_status = payment_rec)
         THEN
              ret_status := payment_rec;

I didn’t look really the function code and stopped on the view referenced by 
the cursor.
The view (we know it just by its name) used in the function is a black box for 
us. Perhaps it is important to begin optimization there!
If values 'PAID' and 'MANUALLYPAID' are an important percentage of table rows 
forcing index use is not a good thing especially when it is done with a 
non-optimized function.

If rows with values 'PAID' and 'MANUALLYPAID'  constitute a little percentage 
of the table, then the partial index plus rewriting the query would be much 
more efficient
Select
  payment_sid_c,
 lms_app.translate_payment_status(payment_sid_c) as paymentstatus
from
  lms_app.lms_payment_check_request
where
 lms_app.translate_payment_status(payment_sid_c) IN ('PAID', 'MANUALLYPAID')
group by
  payment_sid_c

If not, you can gain some performance if you rewrite your query to be like this:

Select
  payment_sid_c,
 lms_app.translate_payment_status(payment_sid_c) as paymentstatus
from
  lms_app.lms_payment_check_request
group by
  payment_sid_c
having
 lms_app.translate_payment_status(payment_sid_c) IN ('PAID', 'MANUALLYPAID')

And you can also try to write the query like this:

Select t.payment_sid_c, lms_app.translate_payment_status(t.payment_sid_c)
From
(
  Select
    payment_sid_c
  from
   lms_app.lms_payment_check_request
  group by
    payment_sid_c
  having
    lms_app.translate_payment_status(payment_sid_c) IN ('PAID', 'MANUALLYPAID')
) t

Regards

Michel SALAIS
De : Kumar, Mukesh <mku...@peabodyenergy.com<mailto:mku...@peabodyenergy.com>>
Envoyé : jeudi 14 avril 2022 16:45
À : Ranier Vilela <ranier...@gmail.com<mailto:ranier...@gmail.com>>
Cc : pgsql-performa...@postgresql.org<mailto:pgsql-performa...@postgresql.org>; 
MUKESH KUMAR <mukesh.kuma...@tcs.com<mailto:mukesh.kuma...@tcs.com>>
Objet : RE: Query Tunning related to function

Hi Rainer ,

We tried to create the partial ‘index on table but it did not help, and it is 
taking approx. 7 sec now.

Also we tried to force the query to use the index by enabling the parameter at 
session level

set enable_seqscan=false;

and it is still taking the time below is the explain plan for the same

https://explain.depesz.com/s/YRWIW#stats<https://urldefense.com/v3/__https:/explain.depesz.com/s/YRWIW*stats__;Iw!!KupS4sW4BlfImQPd!OE7VRYuxv81xKZski81jR9U-OFWiC5_KPW02j0u9iHLcaEbtUo5u_sIfi8VFrToyBiI2A_69MqYrJVb2g-4s$>

Also we running the query which is actually used in application and above query 
is used in below query. Below is the explain plan for same.


https://explain.depesz.com/s/wktl#stats<https://urldefense.com/v3/__https:/explain.depesz.com/s/wktl*stats__;Iw!!KupS4sW4BlfImQPd!OE7VRYuxv81xKZski81jR9U-OFWiC5_KPW02j0u9iHLcaEbtUo5u_sIfi8VFrToyBiI2A_69MqYrJe97dsUq$>

Please assist


Thanks and Regards,
Mukesh Kuma

From: Ranier Vilela <ranier...@gmail.com<mailto:ranier...@gmail.com>>
Sent: Thursday, April 14, 2022 7:56 PM
To: Kumar, Mukesh <mku...@peabodyenergy.com<mailto:mku...@peabodyenergy.com>>
Cc: pgsql-performa...@postgresql.org<mailto:pgsql-performa...@postgresql.org>; 
MUKESH KUMAR <mukesh.kuma...@tcs.com<mailto:mukesh.kuma...@tcs.com>>
Subject: Re: Query Tunning related to function

Em qui., 14 de abr. de 2022 às 08:01, Kumar, Mukesh 
<mku...@peabodyenergy.com<mailto:mku...@peabodyenergy.com>> escreveu:
Hi Team,

We are running the below query in PostgreSQL and its taking approx. 8 to 9 sec 
to run the query.

Query – 1

Select * from
  (
  Select payment_sid_c,
  lms_app.translate_payment_status(payment_sid_c) AS paymentstatus
  from
  lms_app.lms_payment_check_request
  group by payment_sid_c) a
  where  paymentstatus in ('PAID', 'MANUALLYPAID')


The explain plan and other details are placed at below link for more 
information. We have checked the indexes on column but in the explain plan it 
is showing as Seq Scan which we have to find out.


https://explain.depesz.com/s/Jsiw#stats<https://urldefense.com/v3/__https:/explain.depesz.com/s/Jsiw*stats__;Iw!!KupS4sW4BlfImQPd!M8K66GpB-7DvYJA0HYFVpY9mtO6TaqIGRjTLI2G1WNjwK8KA9I8JaEr9OWwGy5F6fC4Ed5dwEjCf_1rBCDg9rA$>


This query is using a function translate_payment_status on column payment_sid_c 
whose script is attached in this mail

Could please anyone help or suggest how to improve the query performance.
You can try create a partial index that help this filter:
Filter: ((lms_app.translate_payment_status(payment_sid_c))::text = ANY 
('{PAID,MANUALLYPAID}'::text[]))

See at:
https://www.postgresql.org/docs/current/indexes-partial.html<https://urldefense.com/v3/__https:/www.postgresql.org/docs/current/indexes-partial.html__;!!KupS4sW4BlfImQPd!M8K66GpB-7DvYJA0HYFVpY9mtO6TaqIGRjTLI2G1WNjwK8KA9I8JaEr9OWwGy5F6fC4Ed5dwEjCf_1quLi3m8Q$>

regards,
Ranier Vilela

Reply via email to