Subject: What is the best way to do this in Postgres

From: kunwar singh <[email-masked]>
Date: Sun, 8 Dec 2024 06:38:53 -0500

Hello Listers,
Looking for your inputs on the most efficient way to do it in Postgres.

What I want to do:
===
I want to spawn 10 concurrent sessions each executing a complex stored
procedure with one of the parameters being the product ID.
Example

CALL process_product(curdate, region, productid=>1) ;
CALL process_product(curdate, region, productid=>2) ;
CALL process_product(curdate, region, productid=>3) ;
CALL process_product(curdate, region, productid=>4) ;
...
CALL process_product(curdate, region, productid=>10) ;

Say I get a list of product IDs by running a big query

Product ID
====
1
2
3
4
..
10

Additional Information
===
Everytime number of product ids will change. At a given time there should
be no more than 10 concurrent sessions of process_product.
I want to trigger these procedure calls once every hour. For a given hour
the number of product IDs could range from 10 to 100 in total.
I am using RDS Postgres v 15.

Question
===
I know I can create a bash script or Python script , but I am wondering if
there is a smarter way to do it in Postgres?

-- 
Cheers,
Kunwar

---

From: "David G. Johnston" <[email-masked]>
Date: Sun, 8 Dec 2024 08:26:43 -0700

> there is a smarter way to do it in Postgres?
Your concurrency requirement makes doing it in the server quite difficult.
Using anything that can launch multiple processes/threads and initiate one
connect each is your best option.  Many things can, so pick one you are
familiar with.  There is little complexity here that specialized tooling
would be needed for.

David J.

---

From: Carl Sopchak <[email-masked]>
Date: Sun, 8 Dec 2024 11:50:21 -0500

You could set up a queuing table to hold the product id's that need
processing, removing that parameter from the proc (or all of them if
all columns vary and are in the queuing table).  Then the proc picks
one product_id from the queue (using delete and capturing the data
deleted data using RETURNING), processes it, then loops for the next
product, terminating when there are none.  A separate job runs to
add new products needing processing to the queue table.  This
technique allows you to run as many simultaneous jobs as you need to
go through all of the products in a timely manner without code
changes.  Also, if one fails, the others will pick up the slack
since they all run until the queue is empty.  I've used this
technique before (although not in Postgres) and it works well.

On 12/8/24 10:26 AM, David G. Johnston
wrote:

On Sunday, December 8, 2024, kunwar singh <[email-masked]>
wrote:

I know I can create a bash script or Python script , but I am wondering if there is a smarter way to do it in Postgres?

Your concurrency requirement makes doing it in the server
quite difficult.  Using anything that can launch multiple
processes/threads and initiate one connect each is your best
option.  Many things can, so pick one you are familiar with.
There is little complexity here that specialized tooling would
be needed for.

David J.

---

From: Erik Brandsberg <[email-masked]>
Date: Sun, 8 Dec 2024 12:06:43 -0500

Check the extension ph_cron, while I have never used it, it may be good to
use as part of the solution.