Size: a a a

pgsql – PostgreSQL

2020 May 22

KK

Konstantin K in pgsql – PostgreSQL
с одним то всё просто
источник

MS

Maxim Sherstuk in pgsql – PostgreSQL
Yaroslav Schekin
И с RESTRICT будет ровно то же самое. Ещё раз, зачем он Вам нужен?
получается да, по умолчанию тоже самое. суть совета в другом - чтобы пробовать удалять записи из родительской таблицы и обрабатывать исключения ограничения целостности, вот до этого я не додумался
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
sexst
Да тут вопрос в том, что если много писать, то быстрее сразу в оперативку записать нежели на диск (что несомненно окажется и в shared_buffers заодно). Минус долгая запись на медленный диск, хоть скорее всего с tmpfs будет немного медленнее выгребать данные нежели из shared_buffers.

fsync=off или fsync=on в контексте tmpfs безразлично - у нее нет backing device. Оно мгновенно отвечает "Готово". Ну syscall не делаем разве что лишний каждый раз.

Так что тут зависит от соотношения времени на заполнение тестовыми данными и на прогон тестов. Если тесты прям сильно дольше делаются - правда ваша. Если сравнимо по времени или дольше заполняется - tmpfs выиграет практически гарантированно.
> что если много писать, то быстрее сразу в оперативку записать нежели на диск

Да. Но с unlogged tables + "fsync=off" + "increase max_wal_size and checkpoint_timeout" (всё из приведённой ранее ссылки) у PostgreSQL никакой необходимости спешить с этим нет.

Т.е. сразу после загрузки данных можно начинать тестировать.

> Ну syscall не делаем разве что лишний каждый раз.

Хотя бы... ;) Но, так или иначе, в этой ситуации — это не преимущество tmpfs.

> Если сравнимо по времени или дольше заполняется - tmpfs выиграет практически гарантированно.

Хмм... не понимаю, почему, можете пояснить?
И я же писал про распределение RAM, в первую очередь.
Конечно, если (допустим) тестовых данных 8 Гб, а всего (доступной / ненужной) памяти 128 Гб — тут можно и инициализировать кластер гигабайт на 16 на tmpfs, и сделать shared_buffers = 16 Гб — но обычно так не бывает (что памяти "слишком много"), IMHO. ;)
источник

s

sexst in pgsql – PostgreSQL
Хм, а удалять с where not exists (blah blah) не будет ли существенно дешевле такой транзакции с откатом?
Кстати говоря, если во второй таблице записей много, то нужно к foreign key ещё соответствующий индекс создать, он сам по умолчанию не создаётся.
источник

MS

Maxim Sherstuk in pgsql – PostgreSQL
это да, читал про это, учтём
источник

AB

Aleksey Budaev in pgsql – PostgreSQL
Почему в одно поле FK я могу вставить значение через INSERT, а в другой таблице, тоже поле FK не могу, ругается (ERROR:  column "id_pacient" of relation "diagnosis" does not exist
источник

MS

Maxim Sherstuk in pgsql – PostgreSQL
там ещё сложность в том, что есть каскадное удаление, в общем сделаю попытку удаления родительской связанной записи после зависимой в триггере)
источник

V

Valery in pgsql – PostgreSQL
sexst
Хм, а удалять с where not exists (blah blah) не будет ли существенно дешевле такой транзакции с откатом?
Кстати говоря, если во второй таблице записей много, то нужно к foreign key ещё соответствующий индекс создать, он сам по умолчанию не создаётся.
Возможно что с индексом это будет быстрее... Тестировать надо
источник

MS

Maxim Sherstuk in pgsql – PostgreSQL
Aleksey Budaev
Почему в одно поле FK я могу вставить значение через INSERT, а в другой таблице, тоже поле FK не могу, ругается (ERROR:  column "id_pacient" of relation "diagnosis" does not exist
похоже, что поля такого нет, чудес не бывает, посмотри перечень столбцов в diagnosis
источник

V

Valery in pgsql – PostgreSQL
Maxim Sherstuk
там ещё сложность в том, что есть каскадное удаление, в общем сделаю попытку удаления родительской связанной записи после зависимой в триггере)
Каскадное будет удалять все записи table2 которые ссылаются на table1 при удалении из table1. Вам это точно требуется?
источник

MS

Maxim Sherstuk in pgsql – PostgreSQL
каскадное будет удалять все записи из table2, но и все записи из table1, на которые больше никто не ссылается из table2 после каскадного удаления. Да, именно такая логика, такое потребовалось)
источник

s

sexst in pgsql – PostgreSQL
Yaroslav Schekin
> что если много писать, то быстрее сразу в оперативку записать нежели на диск

Да. Но с unlogged tables + "fsync=off" + "increase max_wal_size and checkpoint_timeout" (всё из приведённой ранее ссылки) у PostgreSQL никакой необходимости спешить с этим нет.

Т.е. сразу после загрузки данных можно начинать тестировать.

> Ну syscall не делаем разве что лишний каждый раз.

Хотя бы... ;) Но, так или иначе, в этой ситуации — это не преимущество tmpfs.

> Если сравнимо по времени или дольше заполняется - tmpfs выиграет практически гарантированно.

Хмм... не понимаю, почему, можете пояснить?
И я же писал про распределение RAM, в первую очередь.
Конечно, если (допустим) тестовых данных 8 Гб, а всего (доступной / ненужной) памяти 128 Гб — тут можно и инициализировать кластер гигабайт на 16 на tmpfs, и сделать shared_buffers = 16 Гб — но обычно так не бывает (что памяти "слишком много"), IMHO. ;)
"Выиграет" имеется в виду за счёт того, что запишет данные существенно быстрее, а выбирать для тестов будет не сильно медленнее даже если shared_buffers не делать таким, чтобы всё влезло. Оверхед больше, но память всё равно чертовски быстрая.

Это всё, конечно, и правда, так будет только в случае, если постгрес таки начнет писать на диск. Если выкрутить его на максимально отложенную запись настолько, что тесты пройдут быстрее -  да, так tmpfs тоже быстрее не будет.
источник

V

Valery in pgsql – PostgreSQL
@viking_unet Эмм.. Что?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
sexst
"Выиграет" имеется в виду за счёт того, что запишет данные существенно быстрее, а выбирать для тестов будет не сильно медленнее даже если shared_buffers не делать таким, чтобы всё влезло. Оверхед больше, но память всё равно чертовски быстрая.

Это всё, конечно, и правда, так будет только в случае, если постгрес таки начнет писать на диск. Если выкрутить его на максимально отложенную запись настолько, что тесты пройдут быстрее -  да, так tmpfs тоже быстрее не будет.
Так вот, казалось бы, да... Но какой-то минимум записи всё равно будет (по крайней мере, в FS — современная OS/FS тоже не кинется всё это писать, пока у неё есть избыток памяти, и ничто (fsync) её не заставляет ;) ),  по мере relation extensions и т.п.
В общем, если RAM "слишком много" — это лучше измерить, чем рассуждать, Ваша правда. :)
источник

MS

Maxim Sherstuk in pgsql – PostgreSQL
Valery
@viking_unet Эмм.. Что?
да не заморачивайтесь.. есть абстрактный объект, который живёт, пока живёт группа физических объектов, как только все физические объекты удаляются, то и абстрактный объект должен исчезнуть
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Maxim Sherstuk
каскадное будет удалять все записи из table2, но и все записи из table1, на которые больше никто не ссылается из table2 после каскадного удаления. Да, именно такая логика, такое потребовалось)
Триггер Вам поможет.
источник

MS

Maxim Sherstuk in pgsql – PostgreSQL
я на него рассчитываю, они редко подводят)
источник

KK

Konstantin K in pgsql – PostgreSQL
а существует ли способ загнать значения всех полей в xml, не перечисляя каждое?
источник

II

Ivan Iesaulov in pgsql – PostgreSQL
Пытаюсь вот эту команду выполнить
> pg_dump database > outfile

bash: outfile: Permission denied

Подумал, что проблема с пользователем, попылатся сделать
> du

Но выводит не таблицу, а просто список файлов. Не подскажете, в чём может быть проблема? Пытаюсь в своём пет проекте разобраться
источник

II

Ivan Iesaulov in pgsql – PostgreSQL
Хотя ладно, внезапно получилось
источник