@pgsql

Страница 377 из 1062
Denis
26.06.2017
09:33:44
проверил, да, так не работает
create or replace function tor_get() returns table(score float) as $$ begin return query select t.score::float from temp_organization_ratings as t, view_organizations as v where t.organization_id = v.id; exception when undefined_table then return query select 0::float; end $$ language plpgsql stable;

Dmitry
26.06.2017
09:39:48
Сделайте функцию, которая проверяет наличие временной таблицы и возвращает либо пусой кортеж, либо содержимое временной таблицы. Соответственно в запросе обращаетесь к функции вместо временной таблицы

Google
Igor
26.06.2017
10:23:11
Привет! Подскажите пожалуйста, какой вариант лучше использовать для автоматического переключения в схеме мастер/слейв репликации? Так понимаю pgpool2 есть вариант, так же Pacemaker. Поделитесь опытом.

Igor
26.06.2017
10:36:34
после того как хост станет активный repmgr его сможет сам подключить слейвом?

Марат
26.06.2017
10:44:46
сам ? автоматом ?

Igor
26.06.2017
10:44:55
Марат
26.06.2017
10:45:06
нет, руками надо

а pgbouncer + haproxy + keepalived?
а вы сами пробовали данное решение ? как оно у вас работает ?

Igor
26.06.2017
10:46:24
а вы сами пробовали данное решение ? как оно у вас работает ?
нет, пока только разбираюсь, пробовал pgpool в тесте, про pacemaker смотрю, вроде упавшую ноду потом подключает слейвом

Марат
26.06.2017
10:46:51
а pgbouncer + haproxy + keepalived?
что произойдет если у вас оборвалась связь со всеми серверами и когда она была восстановлена ?

самое страшное это получить split-brain

Igor
26.06.2017
10:47:52
что произойдет если у вас оборвалась связь со всеми серверами и когда она была восстановлена ?
так понимаю keepalived должент оставить айпишник на одной ноде, вот как будет вести дальше надо разбираться

Google
Daniel
26.06.2017
12:40:50
Блина, сейчас будет нубовский слегка вопрос

Есть таблица, в ней 2 млн записей Есть запрос на SELECT в эту таблицу с JOIN этой же таблицы...

iqrealty=# EXPLAIN SELECT a.aoid, b.ao_guid FROM base_fias_item_entity a JOIN base_fias_item_entity b ON a.parent_guid = b.ao_guid; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------- Merge Join (cost=343911.75..5237828.12 rows=309983329 width=32) Merge Cond: (a.parent_guid = b.ao_guid) -> Index Scan using fias_parent_search_parent_guid_aoid on base_fias_item_entity a (cost=0.43..266984.98 rows=2293371 width=32) -> Materialize (cost=343839.83..355306.68 rows=2293371 width=16) -> Sort (cost=343839.83..349573.26 rows=2293371 width=16) Sort Key: b.ao_guid -> Seq Scan on base_fias_item_entity b (cost=0.00..62359.71 rows=2293371 width=16)

Или, если удобнее, картинкой



Индекс есть по которому ищет

Darafei
26.06.2017
12:42:22
а что именно тебя не устраивает?

Daniel
26.06.2017
12:42:28
но! :с я даже не дождаться не могу пока запрос выполнится

Andrey
26.06.2017
12:42:32
Или, если удобнее, картинкой
Дарю вам ссылку: https://explain.depesz.com/ )

Daniel
26.06.2017
12:42:34
больше минуты точно занимает

Дарю вам ссылку: https://explain.depesz.com/ )
Опа, она парсит этот формат EXPLAIN?

Daniel
26.06.2017
12:43:04
Вот это круть! СпасибО!

https://explain.depesz.com/s/Wnvq

Darafei
26.06.2017
12:43:58
два миллиона строк, посортировать, добыть им пару из индекса, выплюнуть

чего ты в принципе от него хочешь - ему минимум четыре раза твою таблицу обойти целиком

Daniel
26.06.2017
12:46:15
Ну просто туда еще больше данных сейчас загрузить надо, каждый раз походу индекс пересчитывается и каждый раз получается чуть медленнее инсерт происходит

Darafei
26.06.2017
12:46:29
какую задачу ты решаешь?

Daniel
26.06.2017
12:46:30
Сейчас просто есть скрипты, которые в несколько потоков заполняют базу данных эту

Andrey
26.06.2017
12:47:02
А зачем вам все данные каждый раз читать из этих таблиц? Ограничить выборку нельзя никак?

Google
Darafei
26.06.2017
12:47:22
зачем на вставке что-то выбирать?

Daniel
26.06.2017
12:47:50
Ну надо найти, не вставлено ли это было до этого, INSERT IGNORE INTO?

Блин, вот делаю SELECT a.aoid, b.ao_guid FROM base_fias_item_entity a JOIN base_fias_item_entity b ON a.parent_guid = b.ao_guid;

И он мне убил процесс вообще psql

Ubuntu убила*

Darafei
26.06.2017
12:49:13
что такое insert ignore into?

عاصم بن حارث
26.06.2017
12:50:33
Ну надо найти, не вставлено ли это было до этого, INSERT IGNORE INTO?
а не стоит ли подобный контроль организовывать через уникальные ключи\поля (средствами правильной структуры таблиц), т.е. если кто-то помимо тебя инсертит "те же" данные, то инсерт просто не пройдет в следствии уникальности...

Darafei
26.06.2017
12:51:18
я правильно понимаю, что ты эмулируешь на приложении insert into... on conflict(id) ignore?

Daniel
26.06.2017
12:53:38
Скрипт парсит определенные данные и загружает их, в случае, если данные уже были вставлены - он их должен обновить, т.е. уже UPDATE запрос. Тем не менее, проверка "если данные уже были вставлены" - это выборка по индексу, потому что запросы на запись\обновление отправляются пачками, если за транзакцию (пачка запросов) будет ошибка нарушения уникальности - програмно не получится целый этот батч запросов (транзакцию) заново отправить, а insert по одной записи делать - там очень много данных, чтобы так поступать.

Не, у нас INSERT INTO выполняется чистый в таблицу. Просто за раз там транзакция из 100 инсертов.

И там же могут быть апдейты.

Darafei
26.06.2017
12:56:11
а, ты делаешь insert on conflict (id) do update?

Daniel
26.06.2017
12:58:09
on conflict нету, чтобы не было никаких конфликтов я делаю select до insert\update и уже программно там обрабатываю. просто селект по-сути не такой затратный вроде, находит он по таблице достаточно быстро, а вот инсерт 100 новых записей может вообще от 20 секунд идти.

عاصم بن حارث
26.06.2017
13:04:03
Daniel
26.06.2017
13:05:06
Я вот думаю, может INSERT долгий, потому что там есть блокировки какие-то? Есть 5 воркеров, которые пишут в эту таблицу и заполняют её. Конфигом волшебным тут не решить каким-нибудь?

Daniel
26.06.2017
13:09:29
Т.е.?

Инсерт?

Google
Denis
26.06.2017
13:10:29
Да, 100 записей за 20 секунд

Daniel
26.06.2017
13:11:43
Это много или мало?



Индексы в таблице

Мне кажется их че то много

И каждый пересчитывается после того как происходит INSERT же

Denis
26.06.2017
13:12:36
Мало от слова "очень" даже с учётом индексов. У вас их не 20

Admin
ERROR: S client not available

Daniel
26.06.2017
13:13:11
А можно по человечески? :с

Я ща просто одновременно и про записи и про индексы сказал

И кого там мало\много? :с

Denis
26.06.2017
13:16:47
смотрите. у вас пять индексов на таблицу в 2кк записей. Вставка не может идти с такой низкой скоростью, если только ваш сервер не умирает от нагрузки на дисковую подсистему в момент вставки.

Darafei
26.06.2017
13:18:07
Втяните все в память и выплюньте в одну csv в copy

Это же фиас, он не бесконечный

Daniel
26.06.2017
13:18:49
Так, если в сторону железа нюхать Я кстати на scaleway сижу, 6 ядер, но процессор ARM 6 гб оперативной памяти LSSD диск

Аггей
26.06.2017
13:19:08
А там случаем не много FK?

Daniel
26.06.2017
13:19:08
Google
Darafei
26.06.2017
13:19:59
Если ты на каждые 100 записей вставки достаешь два миллиона, чтобы проверить дубликаты и отказываешься перейти на on conflict, то дело не в железе

Denis
26.06.2017
13:20:57
а что за orm если не секрет?

Daniel
26.06.2017
13:24:10
Doctrine..

Denis
26.06.2017
13:25:06
кстати, есть еще один грязный хак из времен, когда on conflict еще не было. каждый insert оборачивали в транзакцию, а если стреляло duplicate key, то глушилась ошибка и процесс шел дальше по трассе

Andrey
26.06.2017
13:28:17
А нельзя сделать так: insert ... select ... where not exists (select ...)?

Daniel
26.06.2017
13:36:00
Селект по индексу, там все быстро

Darafei
26.06.2017
13:36:31
ну показывал-то ты селект, который "тормозит"

explain (analyze, verbose, buffers) от инсерта в студию :)

Danila
26.06.2017
13:49:00
?

Philip
26.06.2017
14:47:45
От ORM надо будет отходить, это намного дороже по деньгам выйдет сейчас
Можно триггер сделать. Важно понять под каким соусом это orm скормить.

Dmitry
26.06.2017
14:52:53
Ребята, обсуждали или нет вопрос, что будем делать, если телеграм прикроют? Будем куда-то перебазироваться?

عاصم بن حارث
26.06.2017
14:55:07
ходи через сокс5-прокси или впн. )))

Fike
26.06.2017
14:58:25
ssh -D <port> -N my-cool-server

Dmitry
26.06.2017
14:59:09
на телефоне сложновато будет, но изучу вопрос

Pavel
26.06.2017
15:00:45
ssh -D <port> -N my-cool-server
Это же без авторизации будет

Igor
26.06.2017
15:00:59
почему

Pavel
26.06.2017
15:01:34
Ну вот так, открывается порт на сервере, ходи куда хочешь кто хочешь. Через часик через этот прокси начнут ходить еще боты всякие незнакомые.

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