mirror of
https://github.com/postgres/postgres.git
synced 2026-02-18 18:25:17 -05:00
I noticed the "vacuum" regression test taking really significantly longer
than it used to on a slow machine. Investigation pointed the finger at
commit e415b469b3, which added creation of
an index using an extremely expensive index function. That function was
evidently meant to be applied only twice ... but the test re-used an
existing test table, which up till a couple lines before that had had over
two thousand rows. Depending on timing of the concurrent regression tests,
the intervening VACUUMs might have been unable to remove those
recently-dead rows, and then the index build would need to create index
entries for them too, leading to the wrap_do_analyze() function being
executed 2000+ times not twice. Avoid this by using a different table
that is guaranteed to have only the intended two rows in it.
Back-patch to 9.0, like the commit that created the problem.
64 lines
1.9 KiB
SQL
64 lines
1.9 KiB
SQL
--
|
|
-- VACUUM
|
|
--
|
|
|
|
CREATE TABLE vactst (i INT);
|
|
INSERT INTO vactst VALUES (1);
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst VALUES (0);
|
|
SELECT count(*) FROM vactst;
|
|
DELETE FROM vactst WHERE i != 0;
|
|
SELECT * FROM vactst;
|
|
VACUUM FULL vactst;
|
|
UPDATE vactst SET i = i + 1;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst SELECT * FROM vactst;
|
|
INSERT INTO vactst VALUES (0);
|
|
SELECT count(*) FROM vactst;
|
|
DELETE FROM vactst WHERE i != 0;
|
|
VACUUM (FULL) vactst;
|
|
DELETE FROM vactst;
|
|
SELECT * FROM vactst;
|
|
|
|
VACUUM (FULL, FREEZE) vactst;
|
|
VACUUM (ANALYZE, FULL) vactst;
|
|
|
|
CREATE TABLE vaccluster (i INT PRIMARY KEY);
|
|
ALTER TABLE vaccluster CLUSTER ON vaccluster_pkey;
|
|
CLUSTER vaccluster;
|
|
|
|
CREATE FUNCTION do_analyze() RETURNS VOID VOLATILE LANGUAGE SQL
|
|
AS 'ANALYZE pg_am';
|
|
CREATE FUNCTION wrap_do_analyze(c INT) RETURNS INT IMMUTABLE LANGUAGE SQL
|
|
AS 'SELECT $1 FROM do_analyze()';
|
|
CREATE INDEX ON vaccluster(wrap_do_analyze(i));
|
|
INSERT INTO vaccluster VALUES (1), (2);
|
|
ANALYZE vaccluster;
|
|
|
|
VACUUM FULL pg_am;
|
|
VACUUM FULL pg_class;
|
|
VACUUM FULL pg_database;
|
|
VACUUM FULL vaccluster;
|
|
VACUUM FULL vactst;
|
|
|
|
DROP TABLE vaccluster;
|
|
DROP TABLE vactst;
|