@pgsql

Страница 770 из 1062
Maksim
19.04.2018
18:28:15
в первом одна, во втором 2к
bitmap heap scan осуществляется по bitmap'у указателей , упорядоченных по номерам страниц, для смягчения random_page_cost, который имеет место быть при обращении к хипу по указателю с индекса

Kermit
19.04.2018
19:13:57
Всем привет! Буду благодарен за совет по задаче следующего рода: есть таблица, пару миллионов записей, постоянно обновляется (insert/update). Нужно пройтись по каждой записи, порядок не важен, и что-то сделать с ней уже на уровне приложения. Причём, чем быстрее тем лучше. Важным моментом является то, что каждая запись должна быть прочитана хотя бы один раз. На данный момент я реализовал это через трюк с сортировкой и сдвигом (вместо offset+limit), но: - это не будет работать, если нет поля по-которому можно отсортировать учитывая приходящие новые записи - если записей с одинаковым значением поля по которому сортируем >= размер батча, то можно или уйти в цикл или пропустить чего. Ну и много повторной работы.

Как такие задачи решаются по-нормальному?)

Google
Just
19.04.2018
19:15:59
Kermit
19.04.2018
19:16:44
Да, но курсор же делает что-то вроде вьюхи, так? Я к тому что новые записи будут пропущены

Slach
19.04.2018
19:20:01
а как задать права для таблиц которые еще не созданы??? пытаюсь сделать вот так sudo -H -u postgres psql SELECT dblink_exec('dbname=pgbench_db', 'CREATE EXTENSION pglogical'); SELECT dblink_exec('dbname=pgbench_db', 'GRANT ALL PRIVILEGES ON SCHEMA pglogical TO pgbench_user'); SELECT dblink_exec('dbname=pgbench_db', 'GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA pglogical TO pgbench_user'); но потом pgbench выдает какую то фигню pgbench -h localhost -p 6432 -U pgbench_user -i -s 15 pgbench_db pgsql-proxy: NOTICE: table "pgbench_history" does not exist, skipping pgsql-proxy: NOTICE: table "pgbench_tellers" does not exist, skipping pgsql-proxy: NOTICE: table "pgbench_accounts" does not exist, skipping pgsql-proxy: NOTICE: table "pgbench_branches" does not exist, skipping pgsql-proxy: creating tables... pgsql-proxy: ERROR: permission denied for schema pglogical что именно надо задать? в pglogical таблицы и функции созданы для owner pglogical конечно

Just
19.04.2018
19:22:37
Да, но курсор же делает что-то вроде вьюхи, так? Я к тому что новые записи будут пропущены
мне кажется, тут надо или на уровне приложения при вставке данных делать то, что надо, или же добавить уникальное поле и где-то сохранять последнее просмотренное, что бы каждый раз не шерстить всю таблицу

Kermit
19.04.2018
19:28:31
мне кажется, тут надо или на уровне приложения при вставке данных делать то, что надо, или же добавить уникальное поле и где-то сохранять последнее просмотренное, что бы каждый раз не шерстить всю таблицу
При создании - никак, это джоба другого рода. Запускаются периодически после деплоя (и то не всегда). Самой простой аналогией будет отправить записи на переиндексацию, куда-нибудь в эластик например. Или добавить поле с подсчитаным значением из другого сервиса, не доступного в этой базе.

Или смигрировать в другую схему.

Kermit
19.04.2018
19:31:39
тогда добавить уникальное поле, генерируемое самой базой, типа serial, почему не хотите просто так сделать?
Я наверное могу так сделать, звучит резонно. Просто таких таблиц несколько и получается, что это поле будет чисто техническим, под джобы. Но спасибо, вроде ок.

Dmitry
19.04.2018
19:36:55
Grant usage on schema
а можете объяснить, если пользователь отвязан от дб, то как объясняеться то что права надо раздавать уже подключенный к конкретной базе а не к любой?

Just
19.04.2018
19:37:31
Я наверное могу так сделать, звучит резонно. Просто таких таблиц несколько и получается, что это поле будет чисто техническим, под джобы. Но спасибо, вроде ок.
да, 1) только учтите ограничения integer - вроде около 4 млрд и что потом будет перезапись идти, если у вас будет больше данных, то лучше сразу взять bigint и bigserial для него; 2) и то, что если удалять строки, то новые значения для serial будут генерироваться, продолжая нумерацию с удаленных, а не от самого большого в таблице (может я что-то путаю, но замечал такое)

Dmitry
19.04.2018
19:39:09
а то меня тут спросили и я не смог ничего внятного не смог ответить, кроме объяснения что так разработчикам удобнее

Google
Yaroslav
19.04.2018
19:41:44
Да, но курсор же делает что-то вроде вьюхи, так? Я к тому что новые записи будут пропущены
Какое-то у вас странное требование... я к тому, что для snapshot-а курсора этих записей ещё нет, с точки зрения видимого порядка транзакций. Т.е. это, вообще-то, правильное поведение.

Kermit
19.04.2018
19:44:49
Какое-то у вас странное требование... я к тому, что для snapshot-а курсора этих записей ещё нет, с точки зрения видимого порядка транзакций. Т.е. это, вообще-то, правильное поведение.
Ну я запущу джобу, она сделает снимок, всё обработает за полчаса скажем. Довольный пойду домой, а за время ее работы прилетело n-записей, которые были пропущены.

Just
19.04.2018
19:49:13
Да, с 1) уже сталкивались, сделаем. 2) опасно, так можно пропустить запись, если новая влезет посередке :(
вообще сейчас я понял, что это могло быть связано с другим, т.ч. лучше поэкспериментируйте

Kermit
19.04.2018
19:57:14
Это не "за время", а _после_, вообще-то. ;)
После старта, но до финиша) Лок на таблицу же не делается, гарантии, что ничего не упустилось нет) А потом буду прилетать записи в старой схеме.. Хотя их можно и на чтении "подкручивать", но это как-то костыльно)

Yaroslav
19.04.2018
20:02:48
После старта, но до финиша) Лок на таблицу же не делается, гарантии, что ничего не упустилось нет) А потом буду прилетать записи в старой схеме.. Хотя их можно и на чтении "подкручивать", но это как-то костыльно)
В транзакции нет "после старта, но до финиша". Логически они происходят одномоментно/мгновенно. Если вас это не устраивает... что ж, вас ждёт разве что LOCK TABLE.

Kermit
19.04.2018
20:05:50
В транзакции нет "после старта, но до финиша". Логически они происходят одномоментно/мгновенно. Если вас это не устраивает... что ж, вас ждёт разве что LOCK TABLE.
Да, проблема в том, что действия производятся чанками. Каждый в транзакции. Потому что обработать 20мм+ записей в один присест и без retry - немного оптимистично. По-крайней мере у меня не выходило)

Roman
19.04.2018
20:07:06
Добрый вечер, вопрос такой: есть проблема. имеются к примеру записи: 1,2,3,4,5,6,7 и в один прекрасный момент при добавлении элемента в БД появляется ошибка что элемент с таким же ID уже существует, открываю сиквенс а там 6 на счётчике к примеру. кто сталкивался и как лечить? лазил на SO - пишут что счётчик поправить надо. но я как бы не люблю приспосабливаться, больше люблю лечить, посоветуйте откуда копать то

Yaroslav
19.04.2018
20:08:27
Kermit
19.04.2018
20:16:50
По-моему, чанки тут ни при чём... Вы можете показать, как вы, например, 3 записи обработате таким образом / с такими требованиями?
select * from table where created_at > xxx order by created_at asc, uniq_id asc limit n где для первого запроса условие xxx отсутствует, а в каждом последующем это значение берётся из последнего предыдущего.

Yaroslav
19.04.2018
20:22:14
Kermit
19.04.2018
20:24:19
Я не вижу, как это поможет. Ещё раз, вот у вас три записи, и пока вы обрабатываете, кто-то вставляет. И что?
Они вставлются с created_at большим чем было, соответственно четвёртый запрос (в случае n=1) их увидит. Или я что-то путаю?)

Yaroslav
19.04.2018
20:26:08
Они вставлются с created_at большим чем было, соответственно четвёртый запрос (в случае n=1) их увидит. Или я что-то путаю?)
А вы пробовали? Для трёх записей и N=10, например? Какой уровень изоляции вы используете, кстати?

Evgeniy
19.04.2018
20:30:45
>а как задать права для таблиц которые еще не созданы??? alter default privileges

Kermit
19.04.2018
20:53:31
А вы пробовали? Для трёх записей и N=10, например? Какой уровень изоляции вы используете, кстати?
Я возможно не совсем правильно понял просьбу, но если в таблице на момент select было 3 записи, а пока оно кварилось была вставлено ещё пачка, то первый запрос даже при лимите 10 вернёт 3, но второй запрос доберет 10ку. Но да, может быть момент, когда записи придут, а селект их уже не увидит и мы выйдем из цикла. Тогда задача упрощается, я просто сделаю "вью" на момент запуска джобы. Круто, спасибо чату! ?

Google
Yaroslav
19.04.2018
21:04:09
Я возможно не совсем правильно понял просьбу, но если в таблице на момент select было 3 записи, а пока оно кварилось была вставлено ещё пачка, то первый запрос даже при лимите 10 вернёт 3, но второй запрос доберет 10ку. Но да, может быть момент, когда записи придут, а селект их уже не увидит и мы выйдем из цикла. Тогда задача упрощается, я просто сделаю "вью" на момент запуска джобы. Круто, спасибо чату! ?
"Но да, может быть момент, когда записи придут, а селект их уже не увидит и мы выйдем из цикла. " Вот я вам об этом и говорил всё время. Т.е. вы всё равно можете пропустить какие-то INSERT-ы. А если вам это _всё равно_ неважно, почему просто не использовать курсор, и считать время начала этой транзакции конечным моментом обработки (как обычно)?

Alexander
19.04.2018
21:21:13
Привет всем, почему постгрес на запрос: SELECT a.id, MAX(b.id) FROM a JOIN b ON b.a_id = a.id WHERE a.id = 1 GROUP BY a.id ORDER BY b.id DESC; ругается ERROR: column "b.id" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: ... = 1 GROUP BY a.id ORDER BY b.id ?

Vladimir
19.04.2018
21:24:55
Потому что сортируешь по нему

Order by 2 пиши, или алиас задай

Alexander
19.04.2018
21:27:51
хм, Ordery by 2?

Alexander
19.04.2018
22:34:13
Правильно ругается. По чему вы хотели сортировать, по a.id или MAX(b.id)?
В идеале по b.id в рамках a.id. Но ведь постгрес ругается, что b.id должен быть в агрегирующей функции, а он там и лежит...

Alexander
19.04.2018
22:35:33
После агрегации

Yaroslav
19.04.2018
22:35:53
Может быть, вы хотели "ORDER BY a.id, MAX(b.id)"?

Alexander
19.04.2018
22:39:20
Может быть, вы хотели "ORDER BY a.id, MAX(b.id)"?
Хм, а в order by разве можно агрегировать? Действительно, можно. И вроде даже что-то похожее на правду вернул. Спасибо!

(Ещё раз посмотрел на запрос) Хмм... а чего вы хотели-то, вообще? В смысле, цель запроса какая?
Ну он для выяснения проблемы, так классическое получение максимального элемента в группе. Из разряда получения самой дорогой ставки на лот

Просто ошибка ну очень контринтуитивной показалась

Yaroslav
19.04.2018
22:48:00
Хм, а в order by разве можно агрегировать? Действительно, можно. И вроде даже что-то похожее на правду вернул. Спасибо!
Ну, строго говоря, агрерирует GROUP BY. Но, т.к. логическая последовательность выполнения запроса (в этой части): GROUP BY -> SELECT -> ORDER BY, то, соответственно, в последущих шагах можно использовать то, что вычислено на предыдущих, и агрегаты, соответственно, можно использовать после GROUP BY (т.е. в HAVING, SELECT, ORDER BY).

Evgeniy
19.04.2018
23:06:46
@Komzpa GIS MySQL 8.0 delivers geography support. This includes meta-data support for Spatial Reference System (SRS), as well as SRS aware spatial datatypes, spatial indexes, and spatial functions. In short, MySQL 8.0 understands latitude and longitude coordinates on the earth’s surface and can, for example, correctly calculate the distances between two points on the earths surface in any of the about 5000 supported spatial reference systems.

гоу на иннодб

Google
ivan
19.04.2018
23:13:48
Вопрос, как сделать запрос Вот возращается у меня 2 строки, где отличается только одно поле Например (field1=1, field2=1, field3=100) и (field1=1, field2=1, field3=500) Как-то можно их соединить? Чтобы было типо (field1=1, field2=1, field3=[100, 500])?

Evgeniy
19.04.2018
23:14:53
array_agg с групбайчиком

ivan
19.04.2018
23:15:39
Да

Или что-то массивоподобное, что удобно было потом значения вытаскивать

Yaroslav
19.04.2018
23:15:58
Да
См. https://t.me/pgsql/76961 ;)

ivan
19.04.2018
23:16:09
Спасибо, сейчас гляну

Evgeniy
19.04.2018
23:18:41
нет, ну это просто очень крутой релиз https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/

Yaroslav
19.04.2018
23:34:54
Evgeniy
19.04.2018
23:35:56
у них исторически оптимизатор был не оптимизатор

но вот фиксят

зато уже щас сделали мультиколумн

хотя кажется вру

mysql> ANALYZE TABLE payment UPDATE HISTOGRAM ON amount, payment_date WITH 32 BUCKETS; +----------------+-----------+----------+---------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +----------------+-----------+----------+---------------------------------------------------------+ | sakila.payment | histogram | status | Histogram statistics created for column 'amount'. | | sakila.payment | histogram | status | Histogram statistics created for column 'payment_date'. | +----------------+-----------+----------+---------------------------------------------------------+ синтаксис хоть и мультиколумн, но делает две отдельно)

Yaroslav
19.04.2018
23:41:49
но вот фиксят
Да уж, "своевременно".

Evgeniy
19.04.2018
23:44:02
A histogram on the other hand is created once and never updated unless you explicitly ask for it. It will thus not hurt your INSERT/UPDATE/DELETE-performance. скоро автовакуум придумают

Yaroslav
19.04.2018
23:48:43
A histogram on the other hand is created once and never updated unless you explicitly ask for it. It will thus not hurt your INSERT/UPDATE/DELETE-performance. скоро автовакуум придумают
Autoanalyze, в смысле? Да, что-то "оптимизатор" MySQL сильно упал в моих глазах (не то что бы это меня волновало...). ;) Я-то наивно считал, что гистограммы есть во всех "больших" современных СУБД, по умолчанию.

IGOR
20.04.2018
04:14:59
Ребята, по вчерашней проблемой с репликой, вроде стартанула, pg_wal уменьшился значительно, но в слейве данные из с мастером не совпадают, точнее в слейве их меньше за 18 число. Подскажите как перезапустить или перепроверить соответствия данных? чтобы слейв актуализировал свои данные?

IGOR
20.04.2018
04:18:26
https://github.com/ankane/pgsync ручками слушай, а ты точно уверен что реплика работает? как проверяешь?
ну процессы wal replicator стартовали после удаления и создания подписки по новой

Google
Slach
20.04.2018
04:20:08
Народ, помогите разобраться, какого фига постгря лезет в pglogical схему если даже я явно public указываю ? делаю вот так echo "localhost:6432:pgbench_db:pgbench_user:pgbench_pass" > ~/.pgpass chmod 0600 ~/.pgpass psql -h localhost -p 5432 -U pgbench_user pgbench_db pgbench_db=> \dn List of schemas Name | Owner -----------+----------- pglogical | pglogical public | postgres pgbench_db=> DROP TABLE IF EXISTS pgbench_history; ERROR: permission denied for schema pglogical pgbench_db=> DROP TABLE IF EXISTS public.pgbench_history; ERROR: permission denied for schema pglogical

IGOR
20.04.2018
04:28:37
Slach
20.04.2018
04:31:49
другие варианты есть может? или только дропать базу?
ну похоже у вас репликация отвалилась в логах postgres на standby сервере поищите причину сначала странно что заработало после того как "заново подняли" у вас там много UPDATE ?

Slach
20.04.2018
04:34:29
ну видимо растет ты логи то смотрел на сервере на slave и на master? pg_log КАТАЛОГ в main

IGOR
20.04.2018
04:43:03
чет новенькое

Slach
20.04.2018
04:44:45
чет новенькое
ну гугли разбирайся что такое

IGOR
20.04.2018
05:40:31
ну гугли разбирайся что такое
по логам он данные отправляет, только я не пойму, почему он это делает долго. Разница баз 50 Мб, но делает уже почти час, как будто всю базу обходит и ищет изменения. ТК есть записи типа < 2018-04-20 10:36:37.984 +05 > ERROR: replication slot "tpapiallsub_140372_sync_16433" already exists < 2018-04-20 10:36:38.642 +05 > LOG: logical decoding found consistent point at 91/17073548 < 2018-04-20 10:36:38.642 +05 > DETAIL: There are no running transactions.

Междоус
20.04.2018
06:54:49
pgadmin4 не веб версия есть?

Ilya
20.04.2018
07:11:09
на PyQt же

Maxim
20.04.2018
07:24:21
Нет, в новой версии остался только трей с веб сервером. Смотреть только через локальный браузер

Гаврилов
20.04.2018
07:25:39
он 10% от и5 процессора ест(

просто открытый в фоне

Yury
20.04.2018
07:36:46
я ковырял на ранней стадии этот pgadmin, я конечно большой фанат Qt и Python но то что они там учудили мягко говоря фигня. Очень быстро стало понятно что люди до этого такого рода вещи не делали... Веб клиенты бывают быстрые и мало жрущие - VS Code это показывает, но хорошее нативное приложение хоть бы на PyQt оно врятли переплюнет.

Maxim
20.04.2018
07:44:38
Попробуйте запустить его в докере, там теперь нормальный gunicorn и вообще сильно похудевший контейнер, не должен много жрать. Правда порт по умолчанию слушает 80...

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