On 7/24/25 16:59, sivapostg...@yahoo.com wrote:
1.  Testcase.  Created a new database, modified the triggers (split into three), populated required master data, lookup tables.  Then transferred 86420 records. Checked whether all the 86420 records inserted in table1 and also whether the trigger created the required records in table2.  Yes, it created.

2.  In the test case above, the total time taken to insert 86420 records is 1.15 min only.   Earlier (before splitting the triggers) we waited for more than 1.5 hrs first time and 2.5 hrs second time with no records inserted.

3.  Regarding moving the logic to procedure.  Won't the trigger work? Will it be a burden for 86420 records?  It's working, if we insert few thousand records.  After split of trigger function, it's working for 86420 records.  Are triggers overhead for handling even 100000 records? In production system, the same (single) trigger is working with 3 millions of records.  There might be better alternatives to triggers, but triggers should also work.  IMHO.

Reread this post, in the thread, from Laurenz Albe:

https://www.postgresql.org/message-id/de08fd016dd9c630f65c52b80292550e0bcdea4c.camel%40cybertec.at


4.  Staging tables.  Yes, I have done that in another case, where there was a need to add data / transform for few more columns.  It worked like a charm.  In this case, since there was no need for any other calculations (transformation), and with just column to column matching, I thought copy command will do.

There is a transformation, you are moving data to another table. That is overhead, especially if the triggers are not optimized.


Before splitting the trigger into three, we tried
1.  Transferring data using DataWindow / PowerBuilder (that's the tool we use to develop our front end).  With the same single trigger, it took few hours (more than 4 hours, exact time not noted down) to transfer the same 86420 records.  (Datawindow fires insert statements for every row).  Works, but the time taken is not acceptable.

INSERTs by row is going to be slow, especially if the tool is doing a commit for each which I suspect it is. Check the Postgres logs.


2.  Next, we split the larger csv file into 8, with each file containing 10,000 records and the last one with 16420 records.  Copy command worked.  Works, but the time taken to split the file not acceptable.  We wrote a batch file to split the larger csv file.  We felt batch file is easier to automate the whole process using PowerBuilder.

I find most GUI tools create extra steps and overhead. My preference are simpler tools e.g. using Python csv module to batch/stream rows that the Python psycopg2 Postgres driver can insert or copy into the database.
See:

https://www.psycopg.org/psycopg3/docs/basic/copy.html


3.  What we observed here, is insert statement succeeds and copy command fails, if the records exceed a certain no.  Haven't arrived the exact number of rows when the copy command fails.

Will do further works after my return from a holiday.

Happiness Always
BKR Sivaprakash



On Thursday 24 July, 2025 at 08:18:07 pm IST, Adrian Klaver <adrian.kla...@aklaver.com> wrote:


On 7/24/25 05:18, sivapostg...@yahoo.com <mailto:sivapostg...@yahoo.com> wrote:
 > Thanks Merlin, adrain, Laurenz
 >
 > As a testcase, I split the trigger function into three, one each for
 > insert, update, delete, each called from a separate trigger.
 >
 > IT WORKS!.

It worked before, it just slowed down as your cases got bigger. You need
to provide more information on what test case you used and how you
define worked.

 >
 > Shouldn't we have one trigger function for all the three trigger
 > events?  Is it prohibited for bulk insert like this?

No. Triggers are overhead and they add to the processing that need to be
done for moving the data into the table. Whether that is an issue is a
case by case determination.

 >
 > I tried this in PGAdmin only, will complete the testing from the program
 > which we are developing, after my return from holiday.

 From Merlin Moncure's post:

"* reconfiguring your logic to a procedure can be a better idea; COPY
your data into some staging tables (perhaps temp, and indexed), then
write to various tables with joins, upserts, etc."

I would suggest looking into implementing the above.


 >
 > Happiness Always
 > BKR Sivaprakash

 >



--
Adrian Klaver
adrian.kla...@aklaver.com <mailto:adrian.kla...@aklaver.com>



--
Adrian Klaver
adrian.kla...@aklaver.com


Reply via email to