1
1
-- Generic extended statistics support
2
- -- We will be checking execution plans without/with statistics, so
3
- -- let's make sure we get simple non-parallel plans. Also set the
4
- -- work_mem low so that we can use small amounts of data.
2
+ --
3
+ -- Note: tables for which we check estimated row counts should be created
4
+ -- with autovacuum_enabled = off, so that we don't have unstable results
5
+ -- from auto-analyze happening when we didn't expect it.
6
+ --
5
7
-- check the number of estimated/actual rows in the top node
6
8
create function check_estimated_rows(text) returns table (estimated int, actual int)
7
9
language plpgsql as
@@ -184,7 +186,8 @@ CREATE TABLE ndistinct (
184
186
filler3 DATE,
185
187
c INT,
186
188
d INT
187
- );
189
+ )
190
+ WITH (autovacuum_enabled = off);
188
191
-- over-estimates when using only per-column statistics
189
192
INSERT INTO ndistinct (a, b, c, filler1)
190
193
SELECT i/100, i/100, i/100, cash_words((i/100)::money)
@@ -279,7 +282,7 @@ INSERT INTO ndistinct (a, b, c, filler1)
279
282
SELECT mod(i,50), mod(i,51), mod(i,32),
280
283
cash_words(mod(i,33)::int::money)
281
284
FROM generate_series(1,5000) s(i);
282
- VACUUM ( ANALYZE) ndistinct;
285
+ ANALYZE ndistinct;
283
286
SELECT s.stxkind, d.stxdndistinct
284
287
FROM pg_statistic_ext s, pg_statistic_ext_data d
285
288
WHERE s.stxrelid = 'ndistinct'::regclass
@@ -369,13 +372,14 @@ CREATE TABLE functional_dependencies (
369
372
filler3 DATE,
370
373
c INT,
371
374
d TEXT
372
- );
375
+ )
376
+ WITH (autovacuum_enabled = off);
373
377
CREATE INDEX fdeps_ab_idx ON functional_dependencies (a, b);
374
378
CREATE INDEX fdeps_abc_idx ON functional_dependencies (a, b, c);
375
379
-- random data (no functional dependencies)
376
380
INSERT INTO functional_dependencies (a, b, c, filler1)
377
381
SELECT mod(i, 23), mod(i, 29), mod(i, 31), i FROM generate_series(1,5000) s(i);
378
- VACUUM ( ANALYZE) functional_dependencies;
382
+ ANALYZE functional_dependencies;
379
383
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1''');
380
384
estimated | actual
381
385
-----------+--------
@@ -408,7 +412,7 @@ TRUNCATE functional_dependencies;
408
412
DROP STATISTICS func_deps_stat;
409
413
INSERT INTO functional_dependencies (a, b, c, filler1)
410
414
SELECT mod(i,100), mod(i,50), mod(i,25), i FROM generate_series(1,5000) s(i);
411
- VACUUM ( ANALYZE) functional_dependencies;
415
+ ANALYZE functional_dependencies;
412
416
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1''');
413
417
estimated | actual
414
418
-----------+--------
@@ -741,7 +745,7 @@ SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE
741
745
25 | 50
742
746
(1 row)
743
747
744
- VACUUM ( ANALYZE) functional_dependencies;
748
+ ANALYZE functional_dependencies;
745
749
SELECT * FROM check_estimated_rows('SELECT * FROM functional_dependencies WHERE a = 1 AND b = ''1'' AND c = 1');
746
750
estimated | actual
747
751
-----------+--------
@@ -754,7 +758,8 @@ CREATE TABLE functional_dependencies_multi (
754
758
b INTEGER,
755
759
c INTEGER,
756
760
d INTEGER
757
- );
761
+ )
762
+ WITH (autovacuum_enabled = off);
758
763
INSERT INTO functional_dependencies_multi (a, b, c, d)
759
764
SELECT
760
765
mod(i,7),
@@ -838,11 +843,12 @@ CREATE TABLE mcv_lists (
838
843
filler3 DATE,
839
844
c INT,
840
845
d TEXT
841
- );
846
+ )
847
+ WITH (autovacuum_enabled = off);
842
848
-- random data (no MCV list)
843
849
INSERT INTO mcv_lists (a, b, c, filler1)
844
850
SELECT mod(i,37), mod(i,41), mod(i,43), mod(i,47) FROM generate_series(1,5000) s(i);
845
- VACUUM ( ANALYZE) mcv_lists;
851
+ ANALYZE mcv_lists;
846
852
SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1''');
847
853
estimated | actual
848
854
-----------+--------
@@ -875,7 +881,7 @@ TRUNCATE mcv_lists;
875
881
DROP STATISTICS mcv_lists_stats;
876
882
INSERT INTO mcv_lists (a, b, c, filler1)
877
883
SELECT mod(i,100), mod(i,50), mod(i,25), i FROM generate_series(1,5000) s(i);
878
- VACUUM ( ANALYZE) mcv_lists;
884
+ ANALYZE mcv_lists;
879
885
SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1''');
880
886
estimated | actual
881
887
-----------+--------
@@ -1175,7 +1181,7 @@ SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b =
1175
1181
1 | 50
1176
1182
(1 row)
1177
1183
1178
- VACUUM ( ANALYZE) mcv_lists;
1184
+ ANALYZE mcv_lists;
1179
1185
SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a = 1 AND b = ''1''');
1180
1186
estimated | actual
1181
1187
-----------+--------
@@ -1192,7 +1198,7 @@ INSERT INTO mcv_lists (a, b, c, filler1)
1192
1198
(CASE WHEN mod(i,25) = 1 THEN NULL ELSE mod(i,25) END),
1193
1199
i
1194
1200
FROM generate_series(1,5000) s(i);
1195
- VACUUM ( ANALYZE) mcv_lists;
1201
+ ANALYZE mcv_lists;
1196
1202
SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IS NULL AND b IS NULL');
1197
1203
estimated | actual
1198
1204
-----------+--------
@@ -1259,7 +1265,7 @@ SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE a IN (0, 1) AN
1259
1265
-- test pg_mcv_list_items with a very simple (single item) MCV list
1260
1266
TRUNCATE mcv_lists;
1261
1267
INSERT INTO mcv_lists (a, b, c) SELECT 1, 2, 3 FROM generate_series(1,1000) s(i);
1262
- VACUUM ( ANALYZE) mcv_lists;
1268
+ ANALYZE mcv_lists;
1263
1269
SELECT m.*
1264
1270
FROM pg_statistic_ext s, pg_statistic_ext_data d,
1265
1271
pg_mcv_list_items(d.stxdmcv) m
@@ -1280,7 +1286,7 @@ INSERT INTO mcv_lists (a, b, c, d)
1280
1286
(CASE WHEN mod(i,2) = 0 THEN NULL ELSE 0 END),
1281
1287
(CASE WHEN mod(i,2) = 0 THEN NULL ELSE 'x' END)
1282
1288
FROM generate_series(1,5000) s(i);
1283
- VACUUM ( ANALYZE) mcv_lists;
1289
+ ANALYZE mcv_lists;
1284
1290
SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists WHERE b = ''x'' OR d = ''x''');
1285
1291
estimated | actual
1286
1292
-----------+--------
@@ -1337,7 +1343,8 @@ CREATE TABLE mcv_lists_uuid (
1337
1343
a UUID,
1338
1344
b UUID,
1339
1345
c UUID
1340
- );
1346
+ )
1347
+ WITH (autovacuum_enabled = off);
1341
1348
INSERT INTO mcv_lists_uuid (a, b, c)
1342
1349
SELECT
1343
1350
md5(mod(i,100)::text)::uuid,
@@ -1378,7 +1385,8 @@ CREATE TABLE mcv_lists_arrays (
1378
1385
a TEXT[],
1379
1386
b NUMERIC[],
1380
1387
c INT[]
1381
- );
1388
+ )
1389
+ WITH (autovacuum_enabled = off);
1382
1390
INSERT INTO mcv_lists_arrays (a, b, c)
1383
1391
SELECT
1384
1392
ARRAY[md5((i/100)::text), md5((i/100-1)::text), md5((i/100+1)::text)],
@@ -1393,12 +1401,13 @@ CREATE TABLE mcv_lists_bool (
1393
1401
a BOOL,
1394
1402
b BOOL,
1395
1403
c BOOL
1396
- );
1404
+ )
1405
+ WITH (autovacuum_enabled = off);
1397
1406
INSERT INTO mcv_lists_bool (a, b, c)
1398
1407
SELECT
1399
1408
(mod(i,2) = 0), (mod(i,4) = 0), (mod(i,8) = 0)
1400
1409
FROM generate_series(1,10000) s(i);
1401
- VACUUM ( ANALYZE) mcv_lists_bool;
1410
+ ANALYZE mcv_lists_bool;
1402
1411
SELECT * FROM check_estimated_rows('SELECT * FROM mcv_lists_bool WHERE a AND b AND c');
1403
1412
estimated | actual
1404
1413
-----------+--------
@@ -1456,7 +1465,8 @@ CREATE TABLE mcv_lists_multi (
1456
1465
b INTEGER,
1457
1466
c INTEGER,
1458
1467
d INTEGER
1459
- );
1468
+ )
1469
+ WITH (autovacuum_enabled = off);
1460
1470
INSERT INTO mcv_lists_multi (a, b, c, d)
1461
1471
SELECT
1462
1472
mod(i,5),
0 commit comments