Skip to content

Commit 7ebcf4f

Browse files
committed
Improve speed of for portion of updates by using cache
1 parent ce6f6df commit 7ebcf4f

File tree

2 files changed

+30
-12
lines changed

2 files changed

+30
-12
lines changed

expected/43_benchmark_performance.out

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
BEGIN | 0 | 0 secs | | 0 rows | ~0 rows/s
44
Constraints enabled | 0 | 0 secs | 0 secs | 0 rows | ~0 rows/s
55
INSERTs delayed constraints start | 0 | 0 secs | 0 secs | 0 rows | ~0 rows/s
6-
INSERTs delayed constraints end | 10000 | 0 secs | 0 secs | 10000 rows | ~23400 rows/s
6+
INSERTs delayed constraints end | 10000 | 0 secs | 0 secs | 10000 rows | ~25500 rows/s
77
INSERTs immediate constraints start | 0 | 0 secs | 0 secs | 0 rows | ~0 rows/s
8-
INSERTs immediate constraints end | 10000 | 1 secs | 1 secs | 10000 rows | ~18000 rows/s
8+
INSERTs immediate constraints end | 10000 | 1 secs | 1 secs | 10000 rows | ~18500 rows/s
99
Update deferred constraints start | 0 | 1 secs | 0 secs | 0 rows | ~0 rows/s
10-
Update deferred constraints end | 20000 | 11 secs | 10 secs | 20000 rows | ~2100 rows/s
10+
Update deferred constraints end | 20000 | 11 secs | 10 secs | 20000 rows | ~2000 rows/s
1111
Constraints disabled | 0 | 11 secs | 0 secs | 0 rows | ~0 rows/s
1212
Tear down complete | 0 | 11 secs | 0 secs | 0 rows | ~0 rows/s
1313
(10 rows)

sql_saga--1.0.sql

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,17 +1100,35 @@ BEGIN
11001100
* In addition to what the standard calls for, we also remove any
11011101
* columns belonging to primary keys.
11021102
*/
1103-
IF SERVER_VERSION < 100000 THEN
1104-
generated_columns_sql := GENERATED_COLUMNS_SQL_PRE_10;
1105-
ELSIF SERVER_VERSION < 120000 THEN
1106-
generated_columns_sql := GENERATED_COLUMNS_SQL_PRE_12;
1107-
ELSE
1108-
generated_columns_sql := GENERATED_COLUMNS_SQL_CURRENT;
1103+
-- Create a cache table for generated columns if it doesn't exist for this session.
1104+
-- Using to_regclass is a clean way to check for a temp table's existence.
1105+
IF to_regclass('__sql_saga_generated_columns_cache') IS NULL THEN
1106+
CREATE TEMP TABLE __sql_saga_generated_columns_cache (
1107+
table_oid oid PRIMARY KEY,
1108+
column_names name[]
1109+
) ON COMMIT DROP;
11091110
END IF;
11101111

1111-
EXECUTE generated_columns_sql
1112-
INTO generated_columns
1113-
USING info.table_oid;
1112+
-- Try to fetch from cache first
1113+
SELECT column_names INTO generated_columns FROM __sql_saga_generated_columns_cache WHERE table_oid = info.table_oid;
1114+
1115+
IF NOT FOUND THEN
1116+
-- Not in cache, so query catalogs
1117+
IF SERVER_VERSION < 100000 THEN
1118+
generated_columns_sql := GENERATED_COLUMNS_SQL_PRE_10;
1119+
ELSIF SERVER_VERSION < 120000 THEN
1120+
generated_columns_sql := GENERATED_COLUMNS_SQL_PRE_12;
1121+
ELSE
1122+
generated_columns_sql := GENERATED_COLUMNS_SQL_CURRENT;
1123+
END IF;
1124+
1125+
EXECUTE generated_columns_sql
1126+
INTO generated_columns
1127+
USING info.table_oid;
1128+
1129+
-- Store in cache for subsequent calls in this transaction
1130+
INSERT INTO __sql_saga_generated_columns_cache (table_oid, column_names) VALUES (info.table_oid, generated_columns);
1131+
END IF;
11141132

11151133
/* There may not be any generated columns. */
11161134
IF generated_columns IS NOT NULL THEN

0 commit comments

Comments
 (0)