
Tolya
18.07.2018
14:36:14
┌─────────────┬──────────┬─────────────┐
│ stanullfrac │ stawidth │ stadistinct │
├─────────────┼──────────┼─────────────┤
│ 0 │ 13 │ 1.37859e+07 │
└─────────────┴──────────┴─────────────┘
статистика по функциональному индексу

Yaroslav
18.07.2018
14:36:40

Tolya
18.07.2018
14:36:48
да

Google

Tolya
18.07.2018
14:37:22
вынимал через select stanullfrac,stawidth,stadistinct from pg_statistic where starelid = ‘idx_bar_bad’::regclass

Yaroslav
18.07.2018
14:37:41
да
Т.е.
SELECT *
FROM pg_stats
WHERE tablename = 'your_index_name';
А гистограммы и MCV там есть?

Tolya
18.07.2018
14:39:47
Ваш запрос не получается использовать, скорее всего во вьюху не передаются индексы
cannot to read file: Invalid argument
в слотах каталога pg_statistic значения какие-то есть

Yaroslav
18.07.2018
14:44:08

Tolya
18.07.2018
14:47:24
а я, если честно, с ходу не знаю какие там слоты за что отвечают)
они, вроде, через ключи какие-то маппятся
stavalues2, stavalues1 и stanumbers1 заполнены
а дальше у меня не хватило лога истории, чтобы все вместить)

Yaroslav
18.07.2018
14:49:55

Tolya
18.07.2018
14:51:27
не поменялось

Google

Tolya
18.07.2018
14:51:57
но там что-то подозрительное содержится, в том числе есть значения которых быть не может (потому что функция нормализации как раз их удаляет)
не значения, а символы в значениях
больше похоже, что это значения из самого поля, а не из функционального индекса
нет, тут не прав
значения от функции

Yaroslav
18.07.2018
14:54:31

Tolya
18.07.2018
14:55:38
Да
мб статистика по составному функциональному индексу не учитывается?
в моем случае одно поле обычное, второе функциональное
но судя по каталогу все по крайней мере собирается

Yaroslav
18.07.2018
15:03:19

Tolya
18.07.2018
15:07:36
В плане текст запроса с фильтром только по функции?
SELECT foo
FROM table
WHERE bad_func(dar) = '111231';

Yaroslav
18.07.2018
15:11:44

Tolya
18.07.2018
15:12:19
CREATE OR REPLACE FUNCTION bad_func(dar character varying)
RETURNS character varying
LANGUAGE plpgsql
IMMUTABLE STRICT COST 1
AS $function$
BEGIN
RETURN trim(trailing ' ' from regexp_replace(dar, '^[\s0№#\_]+', '', 'g'));
END; $function$;
сама функция

Yaroslav
18.07.2018
15:14:31

Tolya
18.07.2018
15:17:44
не совсем понял, для чего? если вы про то, что функция может не совпадать с той, что на сервере – брал текст из \ef
а все остальные поля из \df+ в общем дублируют определение функции, кроме владельца, схемы и тд (те тех параметров, что я все равно не смогу публично передать)

Google

Yaroslav
18.07.2018
15:20:59

Tolya
18.07.2018
15:23:35
Result data type - character varying
Argument data types - dar character varying

Yaroslav
18.07.2018
15:25:47

Tolya
18.07.2018
15:30:45
да, суперюзер

Yaroslav
18.07.2018
15:32:20
Я тут перечитвал сообщения...
—
> А тип результата у bad_func() какой?
varchar(64)
у поля dar тоже
—
Что-то тут не так, или это какая-то другая функция?

Tolya
18.07.2018
15:32:28
есть ограничения доступа к своим-несвоим табличкам на уровне вьюхи pg_stats, но она именно вьюха

Yaroslav
18.07.2018
15:34:44

Yury
18.07.2018
15:35:39

Yaroslav
18.07.2018
15:36:43

Tolya
18.07.2018
15:37:42
ну это больше на багу похоже, я верил доке до этого момента ?
и тут речь именно про видимость во вьюхе, это же не подтверждает необходимость быть суперпользователем чтобы использовать цельную статистику

Yaroslav
18.07.2018
15:39:00

Tolya
18.07.2018
15:41:11
нет

Yaroslav
18.07.2018
15:42:32
нет
Хмм... у меня вот работают оценки, основанные на вашей функции (по крайней мере, гистограммные).
Т.е. для < , > и т.п. А у вас тоже (в смысле, как и по равенству) нет?

Tolya
18.07.2018
15:45:00
да, для > выдает тоже константные предсказания
и да, на другом стенде тоже работает нормально ?
и планы другие
но данные отилчаются тоже

Google

Yaroslav
18.07.2018
15:47:17

Tolya
18.07.2018
15:47:39
именно работает
выдает правдоподобные оценки, да
но данные несравнимо разные

Dmitriy
18.07.2018
15:48:09
Подскажите пожалуйста
идёт объявление переменных
@tovar
@nomer
@data
А потом
Select @tovar=1, @nomer=123, @data=2018
И это без фром
Какую роль играет здесь select?
Почему присвоение через set просто не написать?

Yaroslav
18.07.2018
15:48:41

Tolya
18.07.2018
15:49:11
отставание по времени на пол года или около того в данных

Admin
ERROR: S client not available

Tolya
18.07.2018
15:49:19
на том, что работает данные за полгода в прошлом
хотя я проверял там не так детально
хотел воспроизвести, получил адекватные косты и планы и ушел оттуда )
версии постгреса и там и там совпадают
но не совпадает все остальное )
конфиги, железо, мощности, данные и тд

Yaroslav
18.07.2018
15:51:47

Tolya
18.07.2018
15:53:17
нет, все нормально ? везде все неработает, перепроверил сейчас
на другом стенде немного другие, но константы
и с > тоже константы

Yaroslav
18.07.2018
15:54:31

Tolya
18.07.2018
15:55:03
хоть что-то объяснилось ?

Yaroslav
18.07.2018
15:58:05
хоть что-то объяснилось ?
А вы можете воспроизвести это на минимальном примере?
Т.е. взять и сделать "копию" схемы этой таблицы, повыкинуть оттуда не относящиеся к делу поля, залить туда немного (INSERT INTO ... SELECT ... FROM orig_table LIMIT 1000000;) данных из оригинальной, создать аналогичный индекс, сделать VACUUM ANALYZE, и проверить оценки?
Дело-то всё в том, что у меня всё работает, на той же версии PostgreSQL. :(

Google

Tolya
18.07.2018
16:00:44
Попробую
Правда, распределение сильно изменится

Yaroslav
18.07.2018
16:02:09

Tolya
18.07.2018
16:02:48
Не должно))
Минут через 30 скину результат

Yaroslav
18.07.2018
16:10:49
Не должно))
Т.е. у вас всё ведёт себя так, как будто статистики вообще нет.
Смотрите:
CREATE OR REPLACE FUNCTION public.random_text(length integer)
RETURNS text
LANGUAGE sql
AS $function$
SELECT string_agg(chr(ascii('A') + (random() * 25)::integer), '' ORDER BY n)
FROM generate_series(1, $1) AS t(n);
$function$;
CREATE TABLE test_func AS
SELECT g.n, CAST(random_text(20) AS character varying) AS random_text
FROM generate_series(1, 100000) AS g(n);
CREATE INDEX ON test_func(bad_func(random_text));
EXPLAIN
SELECT * FROM test_func
WHERE bad_func(random_text) = 'dsadsada';
—
Bitmap Heap Scan on test_func (cost=16.29..719.98 rows=500 width=25)
Обратите внимание, это default selectivity (0.5%).
После чего:
VACUUM ANALYZE test_func;
И в плане получается корректная оценка:
—
Index Scan using test_func_bad_func_idx on test_func (cost=0.42..8.44 rows=1 width=25)


Tolya
18.07.2018
16:20:08
добрался до ноута
да, первая часть как у вас
при создании без аналайза дефолтная селективность
после аналайза то же самое
дефолтная селективность
а, стоп
у вас индекс отличается
я строил аналогичный своему кейсу составной функциональный индекс с условием
а у вас в тесте просто функциональный
построил функциональный индекс и бинго ? оно заработало
создаю аналогичный на целевой табличке конкурентно, но это может быть надолго
по результатам напишу

Yaroslav
18.07.2018
16:27:41