mirror of
https://github.com/postgres/postgres.git
synced 2026-02-03 20:40:14 -05:00
There was a thinko whereby we tested the wrong tuple after fetching it from cache; avoid that by using generate_relation_name instead, which is simpler. Also, the statistics name was not qualified, so add that. (It could be argued that qualification should be conditional on the schema not being on search path. We can add that later, but at least this form is correct.) Author: David Rowley, Álvaro Herrera Discussion: https://postgr.es/m/CAKJS1f8RjLeVZJ2+93pdQGuZJeBF-ifsHaFMR-q-6-Z0qxA8cA@mail.gmail.com
106 lines
2.7 KiB
SQL
106 lines
2.7 KiB
SQL
-- Generic extended statistics support
|
|
|
|
-- Ensure stats are dropped sanely
|
|
CREATE TABLE ab1 (a INTEGER, b INTEGER, c INTEGER);
|
|
CREATE STATISTICS ab1_a_b_stats ON (a, b) FROM ab1;
|
|
DROP STATISTICS ab1_a_b_stats;
|
|
|
|
CREATE SCHEMA regress_schema_2;
|
|
CREATE STATISTICS regress_schema_2.ab1_a_b_stats ON (a, b) FROM ab1;
|
|
|
|
-- Let's also verify the pg_get_statisticsextdef output looks sane.
|
|
SELECT pg_get_statisticsextdef(oid) FROM pg_statistic_ext WHERE staname = 'ab1_a_b_stats';
|
|
|
|
DROP STATISTICS regress_schema_2.ab1_a_b_stats;
|
|
|
|
-- Ensure statistics are dropped when columns are
|
|
CREATE STATISTICS ab1_b_c_stats ON (b, c) FROM ab1;
|
|
CREATE STATISTICS ab1_a_b_c_stats ON (a, b, c) FROM ab1;
|
|
CREATE STATISTICS ab1_a_b_stats ON (a, b) FROM ab1;
|
|
ALTER TABLE ab1 DROP COLUMN a;
|
|
\d ab1
|
|
DROP TABLE ab1;
|
|
|
|
-- Ensure things work sanely with SET STATISTICS 0
|
|
CREATE TABLE ab1 (a INTEGER, b INTEGER);
|
|
ALTER TABLE ab1 ALTER a SET STATISTICS 0;
|
|
INSERT INTO ab1 SELECT a, a%23 FROM generate_series(1, 1000) a;
|
|
CREATE STATISTICS ab1_a_b_stats ON (a, b) FROM ab1;
|
|
ANALYZE ab1;
|
|
ALTER TABLE ab1 ALTER a SET STATISTICS -1;
|
|
ANALYZE ab1;
|
|
DROP TABLE ab1;
|
|
|
|
|
|
-- n-distinct tests
|
|
CREATE TABLE ndistinct (
|
|
filler1 TEXT,
|
|
filler2 NUMERIC,
|
|
a INT,
|
|
b INT,
|
|
filler3 DATE,
|
|
c INT,
|
|
d INT
|
|
);
|
|
|
|
-- unknown column
|
|
CREATE STATISTICS s10 ON (unknown_column) FROM ndistinct;
|
|
|
|
-- single column
|
|
CREATE STATISTICS s10 ON (a) FROM ndistinct;
|
|
|
|
-- single column, duplicated
|
|
CREATE STATISTICS s10 ON (a,a) FROM ndistinct;
|
|
|
|
-- two columns, one duplicated
|
|
CREATE STATISTICS s10 ON (a, a, b) FROM ndistinct;
|
|
|
|
-- correct command
|
|
CREATE STATISTICS s10 ON (a, b, c) FROM ndistinct;
|
|
|
|
-- perfectly correlated groups
|
|
INSERT INTO ndistinct (a, b, c, filler1)
|
|
SELECT i/100, i/100, i/100, cash_words(i::money)
|
|
FROM generate_series(1,10000) s(i);
|
|
|
|
ANALYZE ndistinct;
|
|
|
|
SELECT staenabled, standistinct
|
|
FROM pg_statistic_ext WHERE starelid = 'ndistinct'::regclass;
|
|
|
|
EXPLAIN (COSTS off)
|
|
SELECT COUNT(*) FROM ndistinct GROUP BY a, b;
|
|
|
|
EXPLAIN (COSTS off)
|
|
SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c;
|
|
|
|
EXPLAIN (COSTS off)
|
|
SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c, d;
|
|
|
|
TRUNCATE TABLE ndistinct;
|
|
|
|
-- partially correlated groups
|
|
INSERT INTO ndistinct (a, b, c)
|
|
SELECT i/50, i/100, i/200 FROM generate_series(1,10000) s(i);
|
|
|
|
ANALYZE ndistinct;
|
|
|
|
SELECT staenabled, standistinct
|
|
FROM pg_statistic_ext WHERE starelid = 'ndistinct'::regclass;
|
|
|
|
EXPLAIN
|
|
SELECT COUNT(*) FROM ndistinct GROUP BY a, b;
|
|
|
|
EXPLAIN
|
|
SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c;
|
|
|
|
EXPLAIN
|
|
SELECT COUNT(*) FROM ndistinct GROUP BY a, b, c, d;
|
|
|
|
EXPLAIN
|
|
SELECT COUNT(*) FROM ndistinct GROUP BY b, c, d;
|
|
|
|
EXPLAIN
|
|
SELECT COUNT(*) FROM ndistinct GROUP BY a, d;
|
|
|
|
DROP TABLE ndistinct;
|