
Макс
11.09.2017
13:29:06

Tenni
11.09.2017
13:29:14

sic transit
11.09.2017
13:29:36

Макс
11.09.2017
13:29:48
бесплатно
Да ладно? ))
Это память увеличить или HDD в 2 раза бесплатно? ))

Google

Tenni
11.09.2017
13:30:00

Dmitriy
11.09.2017
13:31:21

Макс
11.09.2017
13:31:22
а зачем? SSD наверное? HDD уже нету.
Вот вы интересные. Сегодня данные занимают один объем, завтра другой. Требования к оперативке при обработке тоже растут. Мы же тут про базы, нет? От вас это особенно странно. Даже требования к разработке web-фронтенда растут.

عاصم بن حارث
11.09.2017
13:31:26
Все прочли статью, про джойны, которую ранее кинули в канал?

Tenni
11.09.2017
13:32:00

Макс
11.09.2017
13:32:04
Я уже в 16 гб оперативки еле влажу.

عاصم بن حارث
11.09.2017
13:33:23
Кстати, на рутрекере есть две части видеокурсов по постгре! На русском, с лабами\сырцами! От установки и админства, до прогерства с ньюансами... Полезно и смотрибельно! Рекомендую.

Darafei
11.09.2017
13:33:47
а есть ссылка? :)

عاصم بن حارث
11.09.2017
13:33:57
сек... ищу...

Mike Chuguniy
11.09.2017
13:34:50
https://postgrespro.ru/education
Не учебные курсы с этой странички, случайно?
Ибо на русском - ещё куда ни шло, но с лабами и сырцами...

Google

عاصم بن حارث
11.09.2017
13:36:04
вот:
1. Базовый курс https://rutracker.org/forum/viewtopic.php?t=5206279
2. Расширенный курс https://rutracker.org/forum/viewtopic.php?t=5252709
Остальное где-то в архиве дома... ((( Надо искать

Mike Chuguniy
11.09.2017
13:36:29
Ага, они самые.

عاصم بن حارث
11.09.2017
13:37:01
У нас новички на ура просмотрели... А потом литературкой и практикой закрепили...

Mike Chuguniy
11.09.2017
13:38:34
Не зашли?
В смысле? Я дал ссылку на оригинал, а не на трекер. С презентациями, лабами и прочими печенюшками.

عاصم بن حارث
11.09.2017
13:39:07

Mike Chuguniy
11.09.2017
13:39:11
Вот базовый курс: https://postgrespro.ru/education/courses/DBA1
Вот расширенный: https://postgrespro.ru/education/courses/DBA2
Там все материалы, имеющиеся в наличии, в отличие от трекера.

عاصم بن حارث
11.09.2017
13:40:21
Да! Хороший сайт.
Но, по вкусу... кто с сайта, кто с трекера... А можно и совместить, по любому на сайте еще куча инфы нужной!

Mike Chuguniy
11.09.2017
13:42:11
Да! Хороший сайт.
Ну вы, блин, даёте, я регулярно оттедова ссылки на документацию выдаю. :)

عاصم بن حارث
11.09.2017
13:43:01

Igor
11.09.2017
13:44:49
есть какие-то важные причины почему нельзя свои данные складывать в базу postgres в постгресе? мне страшно не нравится видеть такое, но хочу подкрепить чувство прекрасного каким-нибудь мануалом

Darafei
11.09.2017
13:45:30
кроме чувства прекрасного - особых причин вроде как нет
хоть не template1

Google

Макс
11.09.2017
13:45:58

عاصم بن حارث
11.09.2017
13:47:33

Макс
11.09.2017
14:06:52
@ExileeD Спасибо огромное! С volume работает :)

Междоус
11.09.2017
14:12:20
Ребят. Есть индекс на boolean столбец. В выборке стоит column = true индекс подключается и работает. А если в условии выборки column = false, то индекс не используется. Что за особенности такие? Тут на просторах нашлось крайне странное решение, использовать индекс на результат функции, которая булево отдает в int и использовать ее же в условиях выборки. Это решение работает, работает быстро. Но что не так с обычным boolean? По сути это ж int представление, даже сам постгрес так считает, но не использует индекс при false.

Andrey
11.09.2017
14:13:07

Алексей
11.09.2017
14:13:58

Междоус
11.09.2017
14:14:03

Алексей
11.09.2017
14:15:06
Вот именно поэтому и не используется. Как сказал Андрей - селективность индекса

Darafei
11.09.2017
14:15:14
ssd и random_page_cost стоит в 4, а не в 1.1? :)

Mikhail
11.09.2017
14:15:40
а что статистика говорит?
SELECT attname As colname, n_distinct,
array_to_string(most_common_vals, E'\n') AS common_vals,
array_to_string(most_common_freqs, E'\n') As dist_freq
FROM pg_stats
WHERE schemaname = 'public' and tablename = 'table' and attname = 'column';

Andrey
11.09.2017
14:16:50
к чему? в чем?
Если строк с column = false (условно) больше, чем с column = true, то использовать индекс СУБД выходит дороже, чем просто прочитать таблицу и не надо её в таком случае заставлять это делать.

Междоус
11.09.2017
14:17:28

Darafei
11.09.2017
14:18:02
но дефолты выставлены в "у нас магнитный вращающийся диск", а не в "у нас SSD", поэтому random_page_cost = 1.1 может разрешить использовать этот индекс, и это стоит сделать, если SSD

Междоус
11.09.2017
14:18:28

Darafei
11.09.2017
14:19:36
потому что эстиматор - он на то и эстиматор, чтобы делать быстрые грубые прикидки
если у него нет статистики, он берёт константу на количество
а статистики по функциям у него обычно нет

Междоус
11.09.2017
14:20:02

Andrey
11.09.2017
14:20:25

Mike Chuguniy
11.09.2017
14:20:46

Google

Darafei
11.09.2017
14:21:40

Pavel
11.09.2017
14:23:29
Даааа, у нас админы как-то отрубили автовакуум. Wraparound долго ждать не пришлось.


OMG2SMART4YOU
11.09.2017
14:44:44
Умный поиск
На БД PostGreSQL создать две таблицы: список сотрудников (ФИО, отдел, должность) и список адресов этих сотрудников. Создать связь между таблицами. В Nodejs приложении создать http метод для поиска по сотрудникам. Поиск должен быть осуществлен по трем полям в этих двух таблицах: ФИО, должность, адрес. Это должен быть умный поиск (smart search), т.е. будет одно поле поиска и можно будет написать несколько ключевых слов, разделив их пробелами. Слова не обязательно писать полностью, поиск должен выводить результаты в которых участвуют все ключевые слова. Выходные поля следующие: ФИО, отдел, должность, адрес.
Например, если пользователь вводит ключевые слова «на афа», то результатами могут быть следующие записи:
Назаров Зафар
Набиев Сафар
Афандиев Навруз
Насриддин Афанди
блин извиняюсь!
просто здесь есть то что я не смог реализовать!
Поиск должен быть осуществлен по трем полям в этих двух таблицах: ФИО, должность, адрес. Это должен быть умный поиск (smart search), т.е. будет одно поле поиска и можно будет написать несколько ключевых слов, разделив их пробелами. Слова не обязательно писать полностью, поиск должен выводить результаты в которых участвуют все ключевые слова. Выходные поля следующие: ФИО, отдел, должность, адрес.
уже целый день мучаюсь с этим(


Darafei
11.09.2017
14:47:31
есть вариант, нанять программиста

Arthur
11.09.2017
14:47:39
если не нужен нечеткий поиск, до вроде достаточно использовать LIKE

Anatoliy
11.09.2017
14:47:43
WHERE field LIKE '%string%'

Darafei
11.09.2017
14:48:04
это больше похоже на ilike

OMG2SMART4YOU
11.09.2017
14:48:26

Darafei
11.09.2017
14:48:53
и триграммный индекс, да

Alexandr
11.09.2017
14:48:54
есть в pg и full text search

OMG2SMART4YOU
11.09.2017
14:49:47
без регулярных выражений?

Mike Chuguniy
11.09.2017
14:49:55
Судя по условию задачи, там несколько полей участвует, а стало быть, имеет смысл смотреть в сторону FTS.
А, уже написали.

Alexandr
11.09.2017
14:50:09
без
вроде с русским тоже работает

Mike Chuguniy
11.09.2017
14:50:39

Google

Arthur
11.09.2017
14:51:25
насчет индекса для like/ilike
https://stackoverflow.com/a/13452528/5448990


Alexander
11.09.2017
14:52:22
Ребята, есть вопрос по поводу блокировок. Допустим, есть две таблицы: users и gifts. В таблице users есть поле users.gift_id, которое ссылается на gifts.id. Каждый gift знает, сколько максимум userов может на него ссылаться (gifts.max_users_amount) и сколько ссылаются в данный момент времени (gifts.current_users_amount). В бизнес-логике приложения нужно реализовать следующее: выбрать user, выбрать незанятый gift (current_users_amount < max_users_amount), привязать gift к user (users.gift_id = gifts.id) и увеличить счетчик gifts.current_users_amount на 1. Сейчас я вижу такую последовательность:
1. найти незанятый gift
2. привязать его к пользователю
3. увеличить количество пользователей в gift.
Но беда в том, что между 1 и 3 кто-то другой уже может захватить этот конкретный gift и тогда 3 шаг выполнить не получится, потому что условие current_users_amount < max_users_amount не выполнится. Разумеется, такая ситуация может возникнуть, когда current_users_amount стремиться к max_users_amount. Теперь вопрос: как предотвратить эту ситуацию? Извлекать gifts с помощью SELECT FOR UPDATE?


OMG2SMART4YOU
11.09.2017
14:52:28
просто я сам с mongodb работаю а в этой задаче postgresql и началось головоломка! придется читать доки и тратить время на это!


Alexandr
11.09.2017
14:53:48
а в монге как вы решали эту задачу? там только regexp
Ребята, есть вопрос по поводу блокировок. Допустим, есть две таблицы: users и gifts. В таблице users есть поле users.gift_id, которое ссылается на gifts.id. Каждый gift знает, сколько максимум userов может на него ссылаться (gifts.max_users_amount) и сколько ссылаются в данный момент времени (gifts.current_users_amount). В бизнес-логике приложения нужно реализовать следующее: выбрать user, выбрать незанятый gift (current_users_amount < max_users_amount), привязать gift к user (users.gift_id = gifts.id) и увеличить счетчик gifts.current_users_amount на 1. Сейчас я вижу такую последовательность:
1. найти незанятый gift
2. привязать его к пользователю
3. увеличить количество пользователей в gift.
Но беда в том, что между 1 и 3 кто-то другой уже может захватить этот конкретный gift и тогда 3 шаг выполнить не получится, потому что условие current_users_amount < max_users_amount не выполнится. Разумеется, такая ситуация может возникнуть, когда current_users_amount стремиться к max_users_amount. Теперь вопрос: как предотвратить эту ситуацию? Извлекать gifts с помощью SELECT FOR UPDATE?
почитайте, что такое транзакции и зачем они нужны


Darafei
11.09.2017
14:55:23
в монге есть js, им можно сделать очень странные вещи, правда, совершенно ужасной вычислительной сложностью

OMG2SMART4YOU
11.09.2017
14:55:33

Alexandr
11.09.2017
14:55:48

OMG2SMART4YOU
11.09.2017
14:56:52

Anatoliy
11.09.2017
14:57:52
более чем

Alexander
11.09.2017
15:00:38

Петр
11.09.2017
15:00:53

Darafei
11.09.2017
15:01:44

Alexandr
11.09.2017
15:01:55

Петр
11.09.2017
15:03:55
в общем случае, пг посто будет ругаться и не применять транзакции
придется просто пофризить в односессионном режиме, все
но, это неприятно, долго и неправильно


Antony
11.09.2017
15:06:22
Всем привет. Есть таблица геоточек с их адрессами.
create table address (lat int not null, lon int not null, lang int not null, address text, PRIMARY KEY(lat, lon, lang));
Так как паралельно в таблицу может сыпаться множество инзертов и селектов и вставляемые данные могли быть уже добавлены.
1) весит тригер (старый постгрес 9.3 без on conflict do nothing)
create or replace function check_addr_row() returns trigger as $$
declare
_exists boolean;
begin
execute format('select exists (select * from %I.%I where lat=%L and lon=%L and lang=%L)', G_TABLE_SCHEMA, TG_TABLE_NAME, new.lat, new.lon, new.lang) INTO _exists;
if not _exists then
return new;
end if;
return null;
end
$$ language plpgsql;
create trigger check_address before insert on address for each row execute procedure check_addr_row();
2) Так же при вставке запрашивается exclusive lock.
begin work;
lock table address in exclusive mode;
insert into add (lat, lon, lang, address) values ($1, $2, $3, $4));
commit work
Тем не менее иногда транзакции отваливаются "duplicate key value violates unique constraint address_pkey", вешая курсор psycopg2 в python
Подскажите в чём может быть ошибка? По идеи exclusive lock должен гарантировать, что только одна транзакция будет изменять данные в таблице (то есть инзерты будут последовательны)
И если мы вставляем с дублирующийся ключ, то тригер не должен допустить вставку.
прошу прощения за много букв