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

Just
19.04.2018
18:29:29


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

Google

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

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
Или смигрировать в другую схему.

Just
19.04.2018
19:29:27

Kermit
19.04.2018
19:31:39

Alex
19.04.2018
19:32:31


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
а то меня тут спросили и я не смог ничего внятного не смог ответить, кроме объяснения что так разработчикам удобнее

Kermit
19.04.2018
19:39:28
да, 1) только учтите ограничения integer - вроде около 4 млрд и что потом будет перезапись идти, если у вас будет больше данных, то лучше сразу взять bigint и bigserial для него; 2) и то, что если удалять строки, то новые значения для serial будут генерироваться, продолжая нумерацию с удаленных, а не от самого большого в таблице (может я что-то путаю, но замечал такое)
Да, с 1) уже сталкивались, сделаем. 2) опасно, так можно пропустить запись, если новая влезет посередке :(

Google

Just
19.04.2018
19:40:50

Alex
19.04.2018
19:41:00

Yaroslav
19.04.2018
19:41:44

Kermit
19.04.2018
19:44:49

Yaroslav
19.04.2018
19:46:11

Just
19.04.2018
19:49:13

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

Yaroslav
19.04.2018
20:02:48

Kermit
19.04.2018
20:05:50

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


Yaroslav
19.04.2018
20:08:27
Добрый вечер, вопрос такой: есть проблема. имеются к примеру записи: 1,2,3,4,5,6,7 и в один прекрасный момент при добавлении элемента в БД появляется ошибка что элемент с таким же ID уже существует, открываю сиквенс а там 6 на счётчике к примеру. кто сталкивался и как лечить? лазил на SO - пишут что счётчик поправить надо. но я как бы не люблю приспосабливаться, больше люблю лечить, посоветуйте откуда копать то
Значит, кто-то когда-то вставил с явным уазанием id.
Запретите правами, например. А в 10-ке есть GENERATED, там, кажется, можно сразу запретить явно указывать id.

Roman
19.04.2018
20:14:21

Kermit
19.04.2018
20:16:50

Yaroslav
19.04.2018
20:22:14

Kermit
19.04.2018
20:24:19

Yaroslav
19.04.2018
20:26:08

Kermit
19.04.2018
20:27:50

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-ы. А если вам это _всё равно_ неважно, почему просто не использовать курсор, и считать время начала этой транзакции конечным моментом обработки (как обычно)?

Kermit
19.04.2018
21:05:32

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?

Yaroslav
19.04.2018
22:00:35

Alexander
19.04.2018
22:34:13

Yaroslav
19.04.2018
22:34:57

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
Просто ошибка ну очень контринтуитивной показалась

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

Alexander
19.04.2018
22:54:28
Ну, строго говоря, агрерирует 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 с групбайчиком

Yaroslav
19.04.2018
23:15:21

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

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

Slach
20.04.2018
04:17:04

IGOR
20.04.2018
04:18:26

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

IGOR
20.04.2018
04:33:48

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 оно врятли переплюнет.

Pavel
20.04.2018
07:40:23

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

Pavel
20.04.2018
07:48:05