@pgsql

Страница 491 из 1062
Vladimir
27.09.2017
15:16:33
сейчас так и есть Работа-Работник Работа-ГруппаРаботников

Google
Vladimir
27.09.2017
15:17:03
а, еще есть Работник-ГруппаРаботников

Mikhail
27.09.2017
15:19:02
Все время хотел разобраться, как работают триггеры в postgre... Подозреваю, что они тут были бы никак кстати

Oleg
27.09.2017
15:21:46
Если реализовывать без триггеров (против которых есть стандартный аргумент о том, что они переносят часть логики приложения в бд), то я бы делал два метода на бэкенде addEmployee(Long workGroupId) и removeEmployee(Long workgroupId), выполняющие все необходимые операции по обновлению счетчиков в транзакциях.

> Есть сомнения по поводу одновременных count = count + 1, есть опасения что эти счетчики буду сходится с реальными цифрами. SELECT FOR UPDATE для лока записи счетчика

Oleg
27.09.2017
15:25:57
Еще один момент - addEmployee() и removeEmployee() должны таким образом захватывать записи счетчиков в строго определенном порядке - либо работа-группа, либо группа-работа

Vladimir
27.09.2017
15:35:33
так, а если без селекта сразу будет апдейт, только несколько в паралель update jobs set active_workers_count = active_workers_count + 1 where id=5; оно нормально отработает?

Vladimir
27.09.2017
15:38:55
ок, всем спасибо, буду думать

Pavel
27.09.2017
15:45:06
Darafei
27.09.2017
15:46:20


Dmitry
27.09.2017
16:35:31
Все запросы в постгресе выполняются в транзакции
Вы хотите сказать, что если я напишу три апдэйта и на третий из рухнет, то rollback произойдет всех изменений? Без savepoint?

Darafei
27.09.2017
16:35:51
в хранимке - да

Google
Roman
27.09.2017
17:14:57
добрый вечер, коллеги. Порекомендуйте софтину под линекс для проектирования базы постгреса, желательно с максимальной поддержкой всех встроеных функций и postgis (в идеале хочется бесплатную, но можно и проверенную платную), спасибо!

Roman
27.09.2017
17:16:57
@Otvorot спасибо, буду смотреть

Maxim
27.09.2017
21:50:42
Народ, не подскажите самый простой способ получить ERD уже существующей БД?

я вот нагуглил достаточно много, а есть такой что бы вот на винду в два клика ставился и делал юзеру хорошо =) ?

хм, для меня это оказался ИДЕ-евский DB-обозреватель, но есть кажись баг - он не показывает связи межд таблицами

Diskord
28.09.2017
01:30:57
Подскажите правильно ли в pl/pgsql в if делать условие на сравнение резудьтатов двух dml операций вида: If (select groups from user where id=2) = (select groups from user where id=4). Работать оно будет, но меня что то смущает в такой записи.

Alexandr
28.09.2017
02:39:31
Подскажите правильно ли в pl/pgsql в if делать условие на сравнение резудьтатов двух dml операций вида: If (select groups from user where id=2) = (select groups from user where id=4). Работать оно будет, но меня что то смущает в такой записи.
Если вас смущает эта запись, объявите две переменных соответсвующего типа и присвойте результаты соответственно. Потом сравниваете переменные

конечно, если это процедура/функция

Vitality
28.09.2017
02:42:39
Вообще нормально решено

Зачем плодить переменные и выделять на них память

Alexandr
28.09.2017
02:46:26
Зачем плодить переменные и выделять на них память
я не думаю что будет оверхед. Память так или иначе выделяется под результаты. Сейчас мы эти результаты присваеваем двум переменным. Разве они копируются? По-хорошему, эти переменные долны указывать на участок памяти с этим результатом, а не на участок памяти с копией. Как-то так. Но, если я не прав, прошу исправить. В пользу двух переменных могу сказать еще то, что так легче читатся (с оговорками, конечно, все зависит от автора)

Vitality
28.09.2017
02:50:32
Переменные декларируется в момент вызова функции. И существуют по времени жизни функции. Само собой это и правда копейки для одного вызова, но ведь ее могут вызвать и множество раз. В общем тут вопрос удобства и памяти

Вся красота постгрес в решении задачи одним запросом. Имхо, конечно же.

Alexandr
28.09.2017
02:53:51
Переменные декларируется в момент вызова функции. И существуют по времени жизни функции. Само собой это и правда копейки для одного вызова, но ведь ее могут вызвать и множество раз. В общем тут вопрос удобства и памяти
Я понимаю. Можете указать на документацию, что там с памятью не так? Я не вижу оверхеда, все же. У вас максимум параллельно работающих клиентов около 200 (в общем случае, конечно), скажем часть их дергает эту функцию. У нас получается оверхед на инициализацию этих переменных как пустых структур, которая по факту копеечная по размеру. Что там не так?

Vitality
28.09.2017
02:58:54
Как я уже говорил, затраты копеечку для одного запроса. Для 200 будет так же, но что если пользователей гораздо больше и каждый вызывает функцию?

Alexandr
28.09.2017
03:00:39
Как я уже говорил, затраты копеечку для одного запроса. Для 200 будет так же, но что если пользователей гораздо больше и каждый вызывает функцию?
так тут у нас же есть max_connections, которая говорит, сколько соединений у нас может быть параллельно

Я когда говорил про количество пользователей, я имел ввиду именно эту настройку. Я понимаю ее как указание БД, сколкьо может быть параллельно работающих сессий на БД

Google
Vitality
28.09.2017
03:05:25
Жертвовать количеством ради того что бы писать переменные вместе решения запросом?

Alexandr
28.09.2017
03:14:49
Жертвовать количеством ради того что бы писать переменные вместе решения запросом?
У нас похоже сложилось непонимание. Если вы про то, что решить можно было выше по-другому, я согласен, можно (и нужно) было и по-другому. Я про то, что использовать в целом переменные - не зло и получаемый оверхед минимален.

Алексей
28.09.2017
03:20:49
Подскажите правильно ли в pl/pgsql в if делать условие на сравнение резудьтатов двух dml операций вида: If (select groups from user where id=2) = (select groups from user where id=4). Работать оно будет, но меня что то смущает в такой записи.
Эта конструкция не будет работать, если один из подзапросов вернет больше одной записи. В данном примере это видимо некритично, так как наверное предполагается наличие первичного ключа по id, но в общем случае констукция некрасивая

В данном случае можно поступить например так: SELECT count(*) FROM "user" a JOIN "user" b ON a.groups = b.groups WHERE a.id = 2 AND b.id = 4;

Alexandr
28.09.2017
03:23:28
Там по одной записи же, groups это просто колонка, из таблице по id получается запись

т.е. там просто SELECT groups FROM user WHERE id = 4

без связей

т.е. группы в самой таблице пользователя

Алексей
28.09.2017
03:24:34
Там по одной записи же, groups это просто колонка, из таблице по id получается запись
SELECT groups FROM user WHERE id = 4 в общем случае может вернуть больше одной записи

Alexandr
28.09.2017
03:25:10
SELECT groups FROM user WHERE id = 4 в общем случае может вернуть больше одной записи
Если id не UNIQUE, что скорее всего, не так. Вы про это?

Алексей
28.09.2017
03:25:31
Да

Если id не уникален, то такое сравнение как у автора работать не будет в случае если один из подзапросов вернул больше одной записи

Alexandr
28.09.2017
03:26:41
В моем опыте, обычно в таких ситуациях ID уникальный

т.е. идет следование определенным соглашениям, если можно так выразиться

Алексей
28.09.2017
03:27:21
Тогда повторюсь, если Вы невнимательно прочитали: "В данном примере это видимо некритично, так как наверное предполагается наличие первичного ключа по id, но в общем случае констукция некрасивая"

Alexandr
28.09.2017
03:29:34
про id не воспринялось, да

Алексей
28.09.2017
03:33:43
А если вдуматься глубже и прочитать между строк, то автора (который видимо уже давно спит) интересовал не столько данный конкретный пример, сколько вообще корректность использования такого рода сравнения, а вот тут уже варианты могут быть совершенно разные.

Alexandr
28.09.2017
03:36:06
Я это понял, почему и предложил объявить две переменные определенного типа, если вы прочитали. Другой разговор, что эту задачу можно было проще решить.

Andrey
28.09.2017
04:40:33
Я это понял, почему и предложил объявить две переменные определенного типа, если вы прочитали. Другой разговор, что эту задачу можно было проще решить.
Можно, только там нужно гарантировать, что запрос вернёт не больше одной записи. А так никакой разницы. Только в записи.

Google
Maxim
28.09.2017
05:21:36
Pgmdd
Спасибо!

Ilya
28.09.2017
05:29:37
https://pp.userapi.com/c841138/v841138968/223e2/B64doRlrVCY.jpg

Sergey
28.09.2017
06:37:31
Народ, не подскажите самый простой способ получить ERD уже существующей БД?
Вчера решал эту задачу с помощью Oracle Data Modeler и pg_dump. Показывает хорошо, но файл со схемой данных, выгруженный pg_dump'ом пришлось немного поправить руками.

Maks
28.09.2017
06:47:19
мне понравилась http://www.dbschema.com/

только нужно еще odbc драйвер поставить

можно сразу к БД подключаться

Сергей
28.09.2017
06:55:05
DBeaver умеет делать диаграммы по БД

Maks
28.09.2017
06:55:40
у меня не получилось(

Сергей
28.09.2017
06:55:57


Maks
28.09.2017
06:55:59
т.е. он построил, но не показал связи по ключам

тут не видно связи по ключам

просто направление связи таблиц

Сергей
28.09.2017
06:56:56


просто тыкни в связь

Maks
28.09.2017
06:58:16
вот у меня 1000 таблиц и в каждую тыкать) тем более если мне это надо распечатать) не очень удобно, но спасибо, буду знать

Denis
28.09.2017
08:19:03
Привет! Я столкнулся с проблемами производительности на нечетком поиске по триграммам в pg. Есть табличка на 400к записей с ФИО, по ней периодически делается нечеткий поиск (когда не нашли по обычному на btree). Проблема в том, что чем длиннее строка поиска на триграммах, тем дольше поиск (что логично, нужно больше триграмм сравнить). То есть я себя нахожу по фамилии и имени с опечаткой за 0,5 сек, а по фамилии, имени с опечаткой и отчеству за 1,1 сек. В связи с этим вопрос, кто-то придумывал варианты радикального ускорения нечеткого поиска в pg? Биграммы не предлагать, они не умеют нечеткий поиск

Darafei
28.09.2017
08:34:32
а индексы созданы? :)

Denis
28.09.2017
08:35:20
Конечно)

Darafei
28.09.2017
08:36:49
а покажи какой-нибудь план, чтобы объём трагедии было видно? :)

Google
Denis
28.09.2017
08:39:14
а покажи какой-нибудь план, чтобы объём трагедии было видно? :)
А вот тут маленькая проблема - я сейчас не за компьютером. Но нечеткий поиск идёт по индексу триграмм. Извиняюсь за то, что вынуждаю вас без плана

Darafei
28.09.2017
08:39:49
попробуй сделать так, чтобы оно влезло в память, например

Denis
28.09.2017
08:43:53
Это решение за счёт ресурсов и оно вряд ли даст существенный прирост - там индекс на 34 мб всего

Vadim
28.09.2017
08:44:25
Без плана - это гадание на кофейной гущи)

Denis
28.09.2017
08:44:45
Попробую сбросить через пару часов

Vadim
28.09.2017
08:44:58
?

Massimo
28.09.2017
10:34:30
Поскажите, у меня client encoding меняется обратно на windows 1251 после перезапуска терминала хотя я ставлю все utf-8

можно ли установить так, чтобы не менялось?

Sergey
28.09.2017
10:38:43
Попробуйте на уровне СУБД alter system set client_encoding ...

Massimo
28.09.2017
10:47:06
Попробуйте на уровне СУБД alter system set client_encoding ...
Спасибо, а еще вопрос. пытаюсь создать бд с локаль с ru_RU.UTF-8, но они не доступны, через pgAdmin 4 тоже создать не получается, даже нету выбора с таким chracter type и collate

Sergey
28.09.2017
10:47:26
База на Windows?

Massimo
28.09.2017
10:48:06
Да к сожалению

Sergey
28.09.2017
10:49:12
Используйте родные для Windows названия локалей и чарсетов. Кажется в initdb это две отдельных опции и выглядят в духе Russia_Russian и UTF8

Но тут, про конкретные значения уже забыл. Подбирал по справочнику из MSDN

Alex
28.09.2017
10:51:14
http://www.g-loaded.eu/2011/02/27/locale-windows/

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