
Ilia
04.04.2018
06:59:15

Sergey
04.04.2018
07:00:03
Таблица большая более 10тыс

Ilia
04.04.2018
07:02:04
Это маленькая . Меня интересует не таблица, а именно записей на одно значение session
Размер самой таблицы не важен

Google

Sergey
04.04.2018
07:06:32

Ilia
04.04.2018
07:09:08

Аггей
04.04.2018
07:11:16

Ilia
04.04.2018
07:11:52

Аггей
04.04.2018
07:12:18
Сейчас найду историю переписки. Может планы даже до и после

Ilia
04.04.2018
07:13:07
есть запрос он выполняеться более 5тыс раз из за чего проседает бд можете подсказать как можно оптимизировать запрос или сделать решение которое ускорит вывод SELECT cdr.start_stamp as start_call,
cdr.answer_stamp as takeoff,
ivr_result.digits as press_key ,
ivr_result.time as press_key_time,
cdr.end_stamp as hangup,
cdr.billsec as call_duration,
golang.uuid,
cdr.hangup_cause,
cdr.cc_record_filename,
cdr.destination_number
FROM golang
LEFT JOIN result_obzvon ON golang.session_id = result_obzvon.session_id
LEFT JOIN ivr_result ON golang.session_id=ivr_result.session_id
LEFT JOIN cdr on golang.uuid = cdr.uuid
WHERE golang.session_id = 'SWRZBwIsfh';
Вот этот запрос, в нём все связи 1:1 же у тебя ?
Или всё же одна таблица 1:N ?
Сколько записей запрос возвращает?

Dmitry
04.04.2018
07:14:40
А hash индекс уже научился реплицироваться?


Ilia
04.04.2018
07:15:28
Сейчас найду историю переписки. Может планы даже до и после
Просто времена примерно одинаковые должны быть, что там что там. O(1+) и O(log N). Почти одно и то же.
И ты советуешь при СКАНИРОВАНИИ Таблицы применять хэшиндекс, а он так наоборот не должен работать.
Я ещё понимаю, где там в запросе сканирование, но просто странный совет.
есть запрос он выполняеться более 5тыс раз из за чего проседает бд можете подсказать как можно оптимизировать запрос или сделать решение которое ускорит вывод SELECT cdr.start_stamp as start_call,
cdr.answer_stamp as takeoff,
ivr_result.digits as press_key ,
ivr_result.time as press_key_time,
cdr.end_stamp as hangup,
cdr.billsec as call_duration,
golang.uuid,
cdr.hangup_cause,
cdr.cc_record_filename,
cdr.destination_number
FROM golang
LEFT JOIN result_obzvon ON golang.session_id = result_obzvon.session_id
LEFT JOIN ivr_result ON golang.session_id=ivr_result.session_id
LEFT JOIN cdr on golang.uuid = cdr.uuid
WHERE golang.session_id = 'SWRZBwIsfh';
И чего тебя вообще там не устраивает (кроме 5 тыщ выполнений конечно) , если время выполнения 0.8 миллисекунд?
Это шикарное время.


Alexey
04.04.2018
07:18:38

Amir
04.04.2018
07:18:55
всем привет, подскажите что может быть из неявного, причины почему индекс, практически в монопольном режиме, на таблице в 22млн записей не может создаться более 22 часов?

Google

Vladimir
04.04.2018
07:19:16

Ilia
04.04.2018
07:19:17
Ну, большая таблица же

Amir
04.04.2018
07:19:26
индекс условный btree(id) where полеN is not null

Ilia
04.04.2018
07:20:00

Amir
04.04.2018
07:20:03
да для нас вроде и не большая, есть и больше
на этой таблице правда параход индексов

Ilia
04.04.2018
07:20:51

Amir
04.04.2018
07:21:15
какие параметры в настройках надо проверить, бд тестовая недавно развернутая
?

Ilia
04.04.2018
07:22:31
Размер Кэша, но он не очень сильно будет влиять.

И•л•ь•д•а•р ☕
04.04.2018
07:22:31
кто ставил pgadmin4 на сервак?, подскажите как ему подключить сертификаты чтобы он по https работал

Аггей
04.04.2018
07:24:05

Amir
04.04.2018
07:30:00
autovacuum_work_mem -1 kB
maintenance_work_mem 4194304 kB
work_mem 131072 kB
effective_cache_size 524288 8kB

Аггей
04.04.2018
07:30:42
А характеристики сервера?

Ilia
04.04.2018
07:31:23
Там ещё что-то про сортировку можно бы потюнить...
Но я не знаю что.
НАшёл
https://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-WORK-MEM

Аггей
04.04.2018
07:33:26
pgtune + на время индексирования maintenance_work_mem побольше.
Про остальное не подскажу. Надо смотреть утилизацию CPU при построении индекса - если у вас iowait - то явно не умещается индекс в maintenance_work_mem - надо поднимать

Google


Amir
04.04.2018
07:33:58
cat /proc/meminfo
MemTotal: 16268356 kB
MemFree: 433164 kB
MemAvailable: 15436532 kB
Buffers: 55936 kB
Cached: 15120648 kB
SwapCached: 36 kB
Active: 8753892 kB
Inactive: 6514656 kB
Active(anon): 99952 kB
Inactive(anon): 224032 kB
Active(file): 8653940 kB
Inactive(file): 6290624 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2096596 kB
Dirty: 364 kB
Writeback: 0 kB
AnonPages: 91968 kB
Mapped: 238056 kB
Shmem: 232020 kB
Slab: 422144 kB
SReclaimable: 397144 kB
SUnreclaim: 25000 kB
KernelStack: 2800 kB
PageTables: 9420 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 18365504 kB
Committed_AS: 2685880 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 176916 kB
VmallocChunk: 34359341052 kB
HardwareCorrupted: 0 kB
AnonHugePages: 40960 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 85952 kB
DirectMap2M: 3059712 kB
DirectMap1G: 15728640 kB
Intel(R) Xeon(R) CPU E5-2683 v4 @ 2.10GHz
stepping : 1
microcode : 0xb000014
cpu MHz : 2094.048
cache size : 40960 KB
4 ядра


Ilia
04.04.2018
07:36:33

Amir
04.04.2018
07:37:10
физ?

Аггей
04.04.2018
07:37:27
MemTotal: 16268356 kB

Ilia
04.04.2018
07:37:55
да
Это 16 гигоу?
ну гиг оставь операционке, гиг на work mem, 12 в кэш. Остальное на конфеты...

Amir
04.04.2018
07:39:25
если накидываю и перечитываю конфиги, то текущее создание индекса прервется уже
?

Евгений
04.04.2018
07:39:32
Коллеги, подскажите, пожалуйста. У меня есть БД . К БД обращается сервер 2200 раз в сек и получает информацию. Порядка 99% информации не изменяется , хранится статично. Каким образом (какие технологии) можно закешировать редко изменяемую информацию БД, чтобы сервер обращался не в БД, а в кеш. Тем самым ускорить получении информации. Но при изменении данных в БД, должен обновляться кещ либо сервер должен брать измененную инфу из БД.

Andrey
04.04.2018
07:42:20

Ilia
04.04.2018
07:43:50

Евгений
04.04.2018
07:43:58

Аггей
04.04.2018
07:44:32
ну гиг оставь операционке, гиг на work mem, 12 в кэш. Остальное на конфеты...
Из доки
Для большинства методов индексов скорость создания индекса зависит от значения maintenance_work_mem. Чем больше это значение, тем меньше времени требуется для создания индекса (если только заданное значение не превышает объём действительно доступной памяти, что влечёт за собой использование подкачки).

Ilia
04.04.2018
07:45:10


Amir
04.04.2018
07:46:24
Ребята спасибо, пошел, тюнить)
индекс лучше заново пересоздать?
наврятли он переживет переделку конфига

Google

Andrey
04.04.2018
07:47:16

Евгений
04.04.2018
07:48:58

Andrey
04.04.2018
07:49:46

crux
04.04.2018
07:52:12
Риторический вброс: хранить конфиги в БД вообще моветон, лучше их хранить именно в файлах, хоть в JSON и раздавать как статику nginx-ом. Нереально снизит нагрузку.
Но, видимо, это тот случай, когда "так исторически сложилось"?

Amir
04.04.2018
07:52:29
сказали что на продуктиве 256гб оперативки
так что норм сейчас на время создания до 12 поднимем maintenance_work_mem
и будем ждать

Dmitry
04.04.2018
07:56:11

Sergey
04.04.2018
07:56:53

Ilia
04.04.2018
07:57:30

Евгений
04.04.2018
07:57:41

Ilia
04.04.2018
07:58:17

Admin
ERROR: S client not available

Dmitry
04.04.2018
07:59:21
Я бы начал с 25% RAM для буферного кеша, а не с 75%

Artem
04.04.2018
07:59:26
SELECT
DISTINCT orders.order_id,
CASE WHEN (orders.tip_id IS NOT NULL AND orders.customer_id = the_company())
THEN COALESCE(orders.tip_date, orders.current_req_for)
ELSE COALESCE(orders.current_jobdate, orders.current_req_for)
END as jobdate
FROM orders
WHERE orders.service_id NOT IN (7100,4100,7200,1000,8100)
ORDER BY jobdate DESC NULLS LAST, order_id DESC
LIMIT 100 OFFSET 0
как можно улучшить:
CASE WHEN (orders.tip_id IS NOT NULL AND orders.customer_id = the_company())
THEN COALESCE(orders.tip_date, orders.current_req_for)
ELSE COALESCE(orders.current_jobdate, orders.current_req_for)
END as jobdate
так как на нее уходит основное время запроса

crux
04.04.2018
08:00:44


Ilia
04.04.2018
08:01:27
SELECT
DISTINCT orders.order_id,
CASE WHEN (orders.tip_id IS NOT NULL AND orders.customer_id = the_company())
THEN COALESCE(orders.tip_date, orders.current_req_for)
ELSE COALESCE(orders.current_jobdate, orders.current_req_for)
END as jobdate
FROM orders
WHERE orders.service_id NOT IN (7100,4100,7200,1000,8100)
ORDER BY jobdate DESC NULLS LAST, order_id DESC
LIMIT 100 OFFSET 0
как можно улучшить:
CASE WHEN (orders.tip_id IS NOT NULL AND orders.customer_id = the_company())
THEN COALESCE(orders.tip_date, orders.current_req_for)
ELSE COALESCE(orders.current_jobdate, orders.current_req_for)
END as jobdate
так как на нее уходит основное время запроса
А как ты понял, что на неё уходит основное время ?


Dmitry
04.04.2018
08:01:30
SELECT
DISTINCT orders.order_id,
CASE WHEN (orders.tip_id IS NOT NULL AND orders.customer_id = the_company())
THEN COALESCE(orders.tip_date, orders.current_req_for)
ELSE COALESCE(orders.current_jobdate, orders.current_req_for)
END as jobdate
FROM orders
WHERE orders.service_id NOT IN (7100,4100,7200,1000,8100)
ORDER BY jobdate DESC NULLS LAST, order_id DESC
LIMIT 100 OFFSET 0
как можно улучшить:
CASE WHEN (orders.tip_id IS NOT NULL AND orders.customer_id = the_company())
THEN COALESCE(orders.tip_date, orders.current_req_for)
ELSE COALESCE(orders.current_jobdate, orders.current_req_for)
END as jobdate
так как на нее уходит основное время запроса
Покажите план.

Artem
04.04.2018
08:01:55

Dmitry
04.04.2018
08:03:11
У вас секскан и сортировка тяжелая без индекса. Case тут не при чём

Евгений
04.04.2018
08:03:21

Amir
04.04.2018
08:04:08
ипопея с долгим индексом:
накинули память, то создание отменил, точнее кинул отмену, но запрос все равно висит в активе
это видимо тоже надолго?

Google

Artem
04.04.2018
08:05:11

Amir
04.04.2018
08:05:16
пробовал pg_cancel_backend
и pg_terminate_backend

Dmitry
04.04.2018
08:05:38

Amir
04.04.2018
08:06:13
нет, поскольку накат ченжей подразумевает условную монополию, то индексы без конкурентли
локов нет)

Сергей
04.04.2018
08:09:27
Пруф что без локов

Dmitry
04.04.2018
08:09:38

Artem
04.04.2018
08:12:36

Dmitry
04.04.2018
08:14:10
Потому чтовозможно, у вашего условия низкая селективность для использования индекса.
Количество записей, которые надо выбрать значительно больше тех, которые отбрасываются по вашему условию

Artem
04.04.2018
08:15:46

Amir
04.04.2018
08:15:57
соответственно эта таблица не используется, нет блокировок
можно индекс делать без конкрурентли
мы просто на тесте тестируем переход на новую версию
приклада

Dmitry
04.04.2018
08:17:19
Т.е. вы отключаете пользователей, обрубаете сессии в момент наката?

Amir
04.04.2018
08:18:11
да это достаточно редкое явление)
примерно раз в месяц
обновление релиза
но если индекс будет долго создаваться, мы не успеем в рамки отведенного времени
там тонна ченжсетов

Dmitry
04.04.2018
08:19:54
Это на тесте/стейдже он у вас долго создаётся?