Faster Inserts with PostgreSQL
As I mentioned yesterday, I'm working on optimizing lots of inserts into a database, and I need solutions for different DB servers. Today I have been working with PostgreSQL. Although the PostgreSQL
COPY command is recommended, I can't seam to get it to work with ColdFusion, and
cfquery. I've tried lots of different ways of doing it.
Fast Insert Solution on PostgreSQL:
So far the fastest solution I have come up with is using
PREPARE to create a temporary prepared statement (yes, I'm aware of
cfqueryparam, and this method inserts with the highest speed). So here's how you do it:
PREPARE preparedInsert (int, varchar) AS INSERT INTO tableName (intColumn, charColumn) VALUES ($1, $2); EXECUTE preparedInsert (1,'a'); EXECUTE preparedInsert (2,'b'); EXECUTE preparedInsert (3,'c'); DEALLOCATE preparedInsert;
Your basically creating a function that allows you to pass variables to your insert statement. Inside the first set of parenthesis you list the types of your variables, then variables are referred to as
$3, etc. inside the statement.
Next you can
EXECUTE the statement as many times as you need to (this can all be done inside one SQL statement, inside one cfquery tag).
Finally when I'm done, I
DEALLOCATE the function, otherwise if you try to
PREPARE a statement named
preparedInsert again during the same connection session you will get an error.
I found that this method was about 20% faster than multiple INSERT statements when sent in the same SQL statement (same cfquery tag). It was about 2-5 times faster than individual INSERT statements - that is, each insert statement had its own SQL statement, or cfquery tag. Finally it was about 25% faster than using bind parameters (cfqueryparam).
- Insert Delayed with MySQL - August 2, 2005
- Top 10 Reserved SQL Keywords - October 28, 2008
- INFORMATION_SCHEMA Support in MySQL, PostgreSQL - February 18, 2008
- SQL to Select a random row from a database table - September 14, 2005
- Cheat Sheet for PostgreSQL - September 7, 2005
Anyways, Postgres 8.4 seems to have a more efficient way of dealing with these things...
- Why is my cron.daily script not running?
- Announcing FuseGuard Version 3
- CFSummit 2017
- Java Unlimited Strength Crypto Policy for Java 9 or 1.8.0_151
- Java 9 Security Enhancements
- Upcoming CFML Conferences in April 2017
- CFSummit 2016 Slides
- Securing Legacy CFML - dev.Objective() 2016 Slides