@pgsql

Страница 891 из 1062
Fike
17.07.2018
22:31:25
SELECT table1.*, jsonb_each_text() FROM ...

Yaroslav
17.07.2018
23:36:56
изначально всё работало без jsonb_each_text(table1.json_column), но сейчас он мне нужен, но из-за него он выдает ошибку неверная ссылка на table1
А вот поэтому надо всё явными JOIN-ами писать! ;) По идее, ваш запрос parse-ится вот так: SELECT table1.* FROM table1, ( jsonb_each_text(table1.json_column) LEFT JOIN table2 ON table1.t2_id = table2.id ) А вот было бы: SELECT table1.* FROM table1 CROSS JOIN LATERAL jsonb_each_text(table1.json_column) AS something LEFT JOIN table2 ON table1.t2_id = table2.id И проблемы бы не было.

Davra
18.07.2018
02:56:13
SELECT table1.*, jsonb_each_text() FROM ...
мой вариант работает, если join убрать

Александр
18.07.2018
03:11:28
Добрый день, подскажите пожалуйста, буферный кэш и кэш операционной системы в итоге кэшируют одни и те же страницы 2 раза?

Google
Farid
18.07.2018
05:17:49
Как посмотреть default text search config?

SHOW default_text_search_config;

Ищу по gin индексу SELECT "item"."params", to_tsvector(COALESCE(("item"."params" ->> 'street'))) AS "search" FROM "item" WHERE to_tsvector(COALESCE(("item"."params" ->> 'street'))) @@ (to_tsquery('Кутузова')); получается регистрозависимый поиск, как сделать регистронезависимый?

Farid
18.07.2018
06:20:05
Юзать to_tsquery('Кутузова', 'russian')
russian у меня конфиг по умолчанию, но при указании такая же байда

Vadim
18.07.2018
06:20:42
Ну и убедиться что LC_LOCALE не C

Farid
18.07.2018
06:20:57
C вроде

ENCODING = 'UTF8' LC_COLLATE = 'C' LC_CTYPE = 'C' TABLESPACE = pg_default

Ну и убедиться что LC_LOCALE не C
Это переменная окружения?

Vadim
18.07.2018
06:27:55
Крепись бро. Придется пересоздавать базу с lc_collate=utf-8

Farid
18.07.2018
06:29:11
Крепись бро. Придется пересоздавать базу с lc_collate=utf-8
Спасибо бро, а остальное правильно?

Vadim
18.07.2018
06:31:05
Lc_ctype тоже

Google
Vadim
18.07.2018
06:31:10
Утф

Leonid
18.07.2018
07:40:41
люди, есть очень странное поведение. если кто-то что-то такое видел, то скажуте куда копать. дано: если модуль на го, работающий с postgres 9.5. работа происходил в 99% случаев в фоновом процессе, который запускается раз в минуту. время от времени ( от 5 минут до часа) процесс соединения модуля и базы (на сервере, где бежит postgres) вырастает ровно на 264 байта. в pg_stat_activity idle последний запрос INSERT, который вызывает ФП. В 95% случаев он откатывается из-за uniq index. кто-то что-то подобное видел? куда копать?

Yaroslav
18.07.2018
07:48:37
люди, есть очень странное поведение. если кто-то что-то такое видел, то скажуте куда копать. дано: если модуль на го, работающий с postgres 9.5. работа происходил в 99% случаев в фоновом процессе, который запускается раз в минуту. время от времени ( от 5 минут до часа) процесс соединения модуля и базы (на сервере, где бежит postgres) вырастает ровно на 264 байта. в pg_stat_activity idle последний запрос INSERT, который вызывает ФП. В 95% случаев он откатывается из-за uniq index. кто-то что-то подобное видел? куда копать?
> если модуль на го, работающий с postgres 9.5. работа происходил в 99% случаев в фоновом процессе, который запускается раз в минуту. А что именно имеется в виду? Background worker (их вообще воможно на Go писать? Я просто не в курсе...)? Или обычный клиент? > процесс соединения модуля и базы (на сервере, где бежит postgres) вырастает ровно на 264 байта. Какой именно процесс? Backend (postgres)? Или какой-то другой?

Leonid
18.07.2018
07:50:18
postgres 26815 0.0 0.2 369152 8860 ? Ss 10:25 0:00 postgres: postgres ...

вот, там где 8860 10 минут назад было 8596

на го написан модуль, он запускается как service, держит соединение постоянное с базой

Yaroslav
18.07.2018
08:05:08
на го написан модуль, он запускается как service, держит соединение постоянное с базой
То есть, обычный клиент. А если трассировать запросы от него (в логах PostgreSQL, log_statement=all)? log_statement, кстати, можно задавать для сессии (явно, после подключения), или для пользователя (ALTER ROLE).

Leonid
18.07.2018
08:05:39
спасибо, попробую

Amir
18.07.2018
08:23:59
подскажите, это как то можно поднастроить: если запрос завершается с ошибкой например ERROR: canceling statement due to user request или FATAL: connection to client lost то в логах нет записи с какими параметрами этот запрос был запущен в нормальном же случае если запрос был исполнен корректно то в логах появляется такая строка следом за запросом 2017-12-22 10:55:54 BLABLABLA [17121]: [156-1] db=bla,appname=192.168.4.71,user=bla_slave,client=192.168.5.111 DETAIL: parameters: $1 = '87833', $2 = '139', $3 = '87833', можно сделать так что бы в случае ERROR или FATAL входящие параметры записались в лог?

получилось так что запрос ушел в длинную транзакцию, стал генерить много временных файлов, запрос пришлось завершить, но в итоге в логах нет данных с какими параметрами пользователь запустил этот запрос, и понять какое место лечить не ясно

Davra
18.07.2018
08:59:02
Добрый день всем, помогите кто не занят: имеется таблица в которой есть колонка c типом jsonb, в ней хранится Jsonb объект. Нужно отфильтровывать запросы по всем значениям (value) внутри этого jsonb объекта, при этом у него могут быть разные ключи. Вот например как работает сейчас: SELECT * FROM table1 WHERE table1.jsonb_column::text LIKE '%filter%'; Однако теперь нужно игнорировать совпадения по ключам и работать только со значениями JSONB объектов .

при этом ключи могут быть разными

Amir
18.07.2018
09:04:14
при этом ключи могут быть разными
отсутствие ключа в jsonb равносильно его присутствию только со значением NULL ) это вам для справки

Davra
18.07.2018
09:04:48
ключ то есть, но он разный кажрый раз

Serg
18.07.2018
09:05:27
select * from table1 where 'filter' in json_each(jsonb_column)

Amir
18.07.2018
09:06:55
самый медленный способ это извлекать все значения по ключу и проверять если же у вас такое что наличие этого ключа это редкое явление, то можно построить соответствующий индекс на наличие этого ключа для ускорения

по мне так лучше всего было использовать jsquery

Google
Davra
18.07.2018
09:10:31
просто попросили добавить фильтр на сайт по этим вот значениям

Amir
18.07.2018
09:10:52
https://postgrespro.ru/docs/postgrespro/9.5/jsquery

Yaroslav
18.07.2018
09:11:43
честно говоря я не знаю по какой причине у нас именно так в бд всё и записывается
Как "так"? Т.е. у вас есть, к примеру {weight = 5 (килограмм), height = 5 (метров)}, и вы ищете 5-ку? Я не понимаю, какой вообще в этом смысл... :(

Amir
18.07.2018
09:13:21
нет, я думаю там как раз Davron не в курсе какие параметры могут пользователи добавить к своим сущностям но раз они добавляют тот же вес или длину или цвет то хотят иметь фильтры по ним)

Amir
18.07.2018
09:15:07
ну все просто, вам же приходит наименование ключа, и значение, можете любой способ применить для фильтрации, но лучше делайте так что точно по индексам работает + сами индексы)

по сути вы делаете фильтр item @@ 'id.%($ > 100)'::jsquery внутри в jsquery вы можете сгененировать прикладом любую логику)

Yaroslav
18.07.2018
09:19:48
нет, я думаю там как раз Davron не в курсе какие параметры могут пользователи добавить к своим сущностям но раз они добавляют тот же вес или длину или цвет то хотят иметь фильтры по ним)
Ну это же не "фильтры по ним" (это я бы понял — например, фильтр по весу 5 килограмм), а фильтры как-то "между" ними (т.е. где название, или вес, или размер, и т.п. — 5... ну, просто 5). :(

Davra
18.07.2018
09:39:56
ладно, всем кто откликнулся спасибо, что-нибудь придумаю

Yaroslav
18.07.2018
09:48:38
по идее одноуровневый
Ну, например: WITH x(n, js) AS ( VALUES (1, '{"a":"foo", "b":"bar"}'::jsonb), (2, '{"a":"bax", "b":"baz"}'::jsonb), (3, '{"a":"baz", "b":"foo"}'::jsonb)) SELECT * FROM x WHERE EXISTS (SELECT 1 FROM jsonb_each_text(x.js) AS t(k, v) WHERE t.v = 'foo') Хотя, по-хорошему, бросали бы вы это дело (в смысле, подумали о нормализации схемы). Чем дальше, тем страшнее будет, я подозреваю. :(

Davra
18.07.2018
09:52:43
вообще решение я вчера нашел, но оно немного корявое: SELECT table1.*, table2.name FROM table1 CROSS JOIN LATERAL jsonb_each_text(table1.jsonb_column) AS jsonb_column LEFT JOIN table2 ON table1.t2_id = table2.id WHERE value LIKE '%filter%';

но пробелема возникает когда в jsonb_column лежит одноуровневый объект с множественными парами ключи-значение

он просто дублирует строки меняя столбец value

Yaroslav
18.07.2018
09:56:15
он просто дублирует строки меняя столбец value
Вы мой запрос попробовали? Если да, какая с ним проблема?

Davra
18.07.2018
10:09:07
https://postgrespro.ru/docs/postgrespro/9.5/jsquery
это разве не расширение?

Google
Yaroslav
18.07.2018
10:09:31
это разве не расширение?
А я разве @amir_i_cano? ;)

Davra
18.07.2018
10:12:44
а ой

Andre
18.07.2018
11:12:15
Привет. В одном из столбцов таблицы есть массив (BIGINT[]). Как эффективно получить строки, у которых содержится конкретное значение в этом массиве?

Admin
ERROR: S client not available

Anton [Mgn, az09@osm]
18.07.2018
11:17:03
> лучше бы вы нормализовали схему...

Денис
18.07.2018
11:26:10
Привет всем Подскажите пожалуйста, время от времени сервер выдает такую ошибку: org.postgresql.util.PSQLException: FATAL: remaining connection slots are reserved for non-replication superuser connections После того как начинает её выдавать ни один сервлет не может подключиться к БД постоянно вылетает, минут через 10 ошибка пропадает, либо после перезагрузки всех сервлетов

Oleg
18.07.2018
11:27:25
я не большой спец, но тут надо в postgres.conf увеличивать параметр max_connections

если на хосте еще есть вычислительные ресурсы типа память. либо смотреть список процессов, решать кого отстреливать, ограничивать в коннекшнах, или прикручивать пулы коннектов или их лимиты на стороне приложения.

Andre
18.07.2018
11:39:26
WHERE "bigintfield" @> "field" ну и там навесить индекс на "bigintfield"
спасибо. получилось вот как: CREATE INDEX ON table1 USING GIN (parent_id); SELECT * FROM table1 WHERE parent_id @> ARRAY[1::BIGINT] AND latest_action_type != 'DELETE';

Andre
18.07.2018
11:41:15
обидно только, что GIN-индекс не может быть на нескольких столбцах

Yaroslav
18.07.2018
11:42:13
Tolya
18.07.2018
11:42:39
Всем привет! Подскажите, пожалуйста, как в PostgreSQL реализован сбор статистики? Допустим, стоит дефолтное значение собирать по 100 самплов с каждого поля. Это значит, что при каждом ANALYZE будут рандомно выдернуты 100 самплов? Или что каждый раз будут выдернуты одни и те же самплы? Если распределение неравномерное, может быть такое, что выполненный несколько раз подряд ANALYZE в итоге приведет к разным планам выполнения запросов? И еще вопрос в продолжение темы – куда смотреть если даже после повышения сбора самплов до 10к и выполнения VACUUM ANALYZE по таблице, планер сильно врет при предсказании ожидаемого числа строк и фактическом результате?

Gennady
18.07.2018
11:50:45
> планер сильно врет при предсказании ожидаемого числа строк и фактическом результате присоединяюсь к вопросу, иногда катастрофически врёт

Yaroslav
18.07.2018
11:59:38
Всем привет! Подскажите, пожалуйста, как в PostgreSQL реализован сбор статистики? Допустим, стоит дефолтное значение собирать по 100 самплов с каждого поля. Это значит, что при каждом ANALYZE будут рандомно выдернуты 100 самплов? Или что каждый раз будут выдернуты одни и те же самплы? Если распределение неравномерное, может быть такое, что выполненный несколько раз подряд ANALYZE в итоге приведет к разным планам выполнения запросов? И еще вопрос в продолжение темы – куда смотреть если даже после повышения сбора самплов до 10к и выполнения VACUUM ANALYZE по таблице, планер сильно врет при предсказании ожидаемого числа строк и фактическом результате?
> Допустим, стоит дефолтное значение собирать по 100 самплов с каждого поля. Это не 100 samples. Это размер MCV и гистограмм. > Это значит, что при каждом ANALYZE будут рандомно выдернуты 100 самплов? Но да, выбираются они (более-менее) случайно. > Или что каждый раз будут выдернуты одни и те же самплы? Нет, если выбирается не вся таблица, то разные. > Если распределение неравномерное, может быть такое, что выполненный несколько раз подряд ANALYZE в итоге приведет к разным планам выполнения запросов? Да, может. > И еще вопрос в продолжение темы – куда смотреть если даже после повышения сбора самплов до 10к и выполнения VACUUM ANALYZE по таблице, планер сильно врет при предсказании ожидаемого числа строк и фактическом результате? В план конкретного запроса — это всё не так просто.

Tolya
18.07.2018
12:05:48
join’ов нет в запросе. Есть выборка по паре полей с плавающей селективностью (зависит от передаваемого в предикат значения) и составной индекс по этим полям

elfiki
18.07.2018
12:05:57
Tolya
18.07.2018
12:06:14
и вот эту плавающую селективность, кажется, постгрес оценить не может или оценивает плохо. а дальше это влияет и на планы

Google
Tolya
18.07.2018
12:07:46
условно, иногда есть кейсы, когда постгрес ожидает 20к+ строк, когда по факту запрос возвращает одну строку

Yaroslav
18.07.2018
12:08:18
и вот эту плавающую селективность, кажется, постгрес оценить не может или оценивает плохо. а дальше это влияет и на планы
А вы бы смогли (серьёзно)? Вот у вас, например, есть гистограммы распределения для каждого из полей, допустим, age и married. Как бы вы посчитали ожидаемое количество записей в запросе: "SELECT * FROM people WHERE married AND age < 12;" ?

Tolya
18.07.2018
12:09:07
про то и речь. чтобы понять, смог бы я или нет, пытаюсь разобраться в алгоритме работы PostgreSQL при сборе статистики

наверное, смог бы, если бы все было так просто, как я выше описал. По факту там вместо одного значения еще и функция передается. На это поле построен функциональный индекс и по нему также поднята до максимума статистика. точнее, это поле как раз входит в составной индекс

и вот если бы не он, помогла бы фича с create statistics, вероятно а так постгрес не может связать поля из индекса и таблицы

и сэмплов 10к явно мало для большой таблицы, а поднять выше не выходит

Yaroslav
18.07.2018
12:11:54
про то и речь. чтобы понять, смог бы я или нет, пытаюсь разобраться в алгоритме работы PostgreSQL при сборе статистики
Ну вот попробуйте на этом примере. Понятно, что использовать предположение независимости переменных неправильно (я даже где-то видел исследование, где указывались цифры вроде "в 70% случаев для реальных данных")... но а какое правильно? :(

Tolya
18.07.2018
12:12:14
я понимаю, что можно изменить модель таблицы и что-то еще с другой стороны придумать и так скорее всего и пойдем просто уже интересно стало доразобраться в данном случае, что именно приводит к затыку в планах

Tolya
18.07.2018
12:13:32
Ещё раз, это не 10к samples.
сорри, пропустил одно сообщение

MCV = most common values?

а планы разве не на основе гистограмм строятся?

Страница 891 из 1062