Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

241
Views
Reemplazo de PSQL para procedimiento almacenado, demasiado lento

Tengo una property , cada property tiene contracts , cada contract tiene un campo de enteros rental_area .

Anteriormente, tenía que obtener el área de rental_area de todos los contratos sumados por propiedad y esto funcionó.

 SELECT Sum(cr.rental_area) total_property_rental_area, -- bunch of other cr fields FROM appdata.contract_rental cr INNER JOIN appdata.domain_building b1 ON ( b1.building_id = cr.building_id ) INNER JOIN appdata.domain_immovable im1 ON ( im1.immovable_id = b1.immovable_id ) GROUP BY im1.property_id

Ahora la lógica cambió, y el contrato tiene una lista de periods , y uno de esos períodos contiene el área de rental_area de ese contrato. Y encontrar ese period correcto necesitaba una lógica especial.

Traté de unir la lógica a la consulta, pero no pude encontrar un lugar donde colocarlo, así que tuve que crear un procedimiento almacenado.

 SELECT Sum(p.rental_area) total_property_rental_area -- bunch of other cr fields FROM appdata.contract_rental cr JOIN appdata.rental_period p ON p.id = Get_current_period_id(cr.contract_rental_id, cr.end_date_actual) INNER JOIN appdata.domain_building b1 ON ( b1.building_id = cr.building_id ) INNER JOIN appdata.domain_immovable im1 ON ( im1.immovable_id = b1.immovable_id ) GROUP BY im1.property_id

Procedimiento:

 CREATE OR REPLACE FUNCTION appdata.get_current_period_id(in contract_id_in bigint, in end_date_actual_in Date) RETURNS bigint AS $BODY$ DECLARE period_id bigint; BEGIN -- find the period that matches with end date or current date select id into period_id from rental_period where contract_id = contract_id_in and Coalesce(end_date_actual_in, Now()) >= start_date order by start_date desc limit 1; -- if there was no period, just take the first one IF period_id is null THEN select id into period_id from rental_period where contract_id = contract_id_in order by start_date asc limit 1; END IF; return period_id; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100;

Pero ahora es demasiado lento, ¿hay alguna manera de poner la lógica de búsqueda de períodos en el sql para hacerlo más rápido, sin usar el procedimiento almacenado? El punto es que, para alcanzar el contrato, solo tiene que obtener un período único según la lógica.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Implemente su procedimiento almacenado nuevamente en el SQL principal, la sugerencia principal es fusionar sus 2 consultas (si una es nula, use la otra)

Ejemplo: En lugar de

 p.id = Get_current_period_id(cr.contract_rental_id, cr.end_date_actual)

Usar:

 p.pid = coalesce( (select rpx.id from rental_period rpx where contract_id = cr.contract_rental_id and Coalesce(cr.end_date, Now()) >= start_date order by start_date desc limit 1; ), ( select rpy.id from rental_period rpy where contract_id = cr.contract_rental_id order by start_date asc limit 1; ) )

Según el comentario a continuación, el siguiente índice también puede ayudar:

 create index on rental_period (contract_id, start_date asc)

asegúrese de analizar la tabla después para actualizar las estadísticas.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!