
Айтуар
26.06.2017
09:19:59

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
Сделайте функцию, которая проверяет наличие временной таблицы и возвращает либо пусой кортеж, либо содержимое временной таблицы. Соответственно в запросе обращаетесь к функции вместо временной таблицы

Denis
26.06.2017
09:40:41

Google

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

Марат
26.06.2017
10:35:47

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
нет, руками надо

Igor
26.06.2017
10:46:24

Марат
26.06.2017
10:46:51
самое страшное это получить split-brain

Inal
26.06.2017
10:47:45

Igor
26.06.2017
10:47:52

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

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

Andrey
26.06.2017
12:42:58

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

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 инсертов.
И там же могут быть апдейты.


عاصم بن حارث
26.06.2017
12:56:07
Скрипт парсит определенные данные и загружает их, в случае, если данные уже были вставлены - он их должен обновить, т.е. уже UPDATE запрос.
Тем не менее, проверка "если данные уже были вставлены" - это выборка по индексу, потому что запросы на запись\обновление отправляются пачками, если за транзакцию (пачка запросов) будет ошибка нарушения уникальности - програмно не получится целый этот батч запросов (транзакцию) заново отправить, а insert по одной записи делать - там очень много данных, чтобы так поступать.
делай пачки поменьше и ставь метки (внутри транзакции это можно) и откатывайся на сохрененную метку если такие данные уже "есть", то меняй инсерт на апдейт, потом комить транзакцию

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 воркеров, которые пишут в эту таблицу и заполняют её.
Конфигом волшебным тут не решить каким-нибудь?

Denis
26.06.2017
13:09:15

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
А можно по человечески? :с
Я ща просто одновременно и про записи и про индексы сказал
И кого там мало\много? :с

Darafei
26.06.2017
13:16:32

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

Daniel
26.06.2017
13:17:13

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

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

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

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