
OlegBrony
03.04.2018
09:13:16
Кстати, я от @bobrovskiy_roman. Знаете такого?

Evgeny
03.04.2018
09:13:25
ну в 3м же просто join сделать и where
Theta Join = this is the general join everybody uses because it allows you to specify the condition (the ON clause in SQL).

OlegBrony
03.04.2018
09:20:46

Google

Dmitry
03.04.2018
09:21:56

Ilia
03.04.2018
09:22:34

OlegBrony
03.04.2018
09:23:20

Ilia
03.04.2018
09:23:24

OlegBrony
03.04.2018
09:24:28

Dmitry
03.04.2018
09:24:34

Ilia
03.04.2018
09:24:50

Dmitry
03.04.2018
09:26:08
Что значит выбрасывай когда ради неё все и делается. Она не через offset разумеется, а через < > на name

Ilia
03.04.2018
09:26:15

Google

Ilia
03.04.2018
09:27:29

Dmitry
03.04.2018
09:28:18
Известно как - вторая страница начинается с последнего name на первой

Ilia
03.04.2018
09:29:32
В таблице. Что значит пагинация нафиг?
ЕСЛИ у тебя в таблице только 150 тыщ записей, то это не очень много. Ты можешь насоздавать индексы как было указано выше, и на этом успокоиться.
Никакой columnstore тут естественно не нужен.
Максимум что придётся сделать, это запинить таблицу в кэш, если это возможно.

Dmitry
03.04.2018
09:32:35
150 тыщ, но там на самом деле ещё пачка других колонок. Индексы по нескольким числовым колонкам не вижу смысла, поскольку их набор не известен. Вопрос насколько хорошо будет работать partial индекс

Konstantin
03.04.2018
09:34:21
150 тыщ записей и последовательным поиском можно достаточно быстро перебрать. Особенно если задействовать параллелизм.

Ilia
03.04.2018
09:34:35

Dmitry
03.04.2018
09:36:14
Нет, последовательно слишком медленно
Плюс джойны

OlegBrony
03.04.2018
09:39:45
Что делает слово times в SQL?

Ilia
03.04.2018
09:40:12

Dmitry
03.04.2018
09:41:01
Это больше полсекунды

Yaroslav
03.04.2018
09:42:15

Konstantin
03.04.2018
09:42:24
А что говорит explain analyze на план выполнения запроса?

Dmitry
03.04.2018
09:42:49
Прямо сейчас нет
Я писал что говорит explain конкретно для этих колонок, по ним всё укладывается, вопрос был в том можно ли там оптимизировать жирные индексы

Ilia
03.04.2018
09:52:39

Google

Dmitry
03.04.2018
10:09:01
Это я и сам могу. Меня интересовали хитрые типы индексов и подводные камни partial индекса только по менее селективной части ключа

Сергей
03.04.2018
10:09:48

Ilia
03.04.2018
10:34:41

Dmitry
03.04.2018
10:53:21
Нутк предположение что тогда пг выберет индекс пр самому селективному, а что там с остальными - не важно

Ilia
03.04.2018
11:09:28
Так составные индексы надо делать...

Paul
03.04.2018
12:05:45
а ктонидь уже пробовал крутить постгре на Intel Optane™ SSD ?
есть ли профит и резон?
больше всего интересует не только на самом оптане, но и под управлением под линями
вопрос в контексте статьи:
На сервере была установлена ОС Ubuntu 16.04 с ядром 4.13.
Обратите внимание! Чтобы получить хорошую производительность NVMe-накопителей, требуется версия ядра не ниже 4.10. С более ранними версиями ядра результаты будут хуже: поддержка NVMe в них надлежащим образом не реализована.
https://habrahabr.ru/company/selectel/blog/352622/
"Чтобы получить хорошую производительность NVMe-накопителей, требуется версия ядра не ниже 4.10. С более ранними версиями ядра результаты будут хуже: поддержка NVMe в них надлежащим образом не реализована." - вдруг для кого-то это будет откровением, чтобы не бодаться с тормозами на потенциально ракетном железе

Sergey
03.04.2018
13:09:20

Paul
03.04.2018
13:18:01
тота и оно, что железо свежайшее и крайне не дешёвое - потому и присматриваться к нему нужно осмотрительно и взвешенно

Tolya
03.04.2018
14:00:42
всем привет)
подскажите, пожалуйста, для чего нужен и где используется search_path базы ?
search_path пользователя или функции понятно, а в каких кейсах search_path базы нужен не смог найти

Eugeny
03.04.2018
14:01:10

Tolya
03.04.2018
14:01:29
а чем он отличается от пользовательского тогда ?

Eugeny
03.04.2018
14:01:29
например у тебя есть схема main1_ main2 и тд

Tolya
03.04.2018
14:02:53
вот есть два альтера
alter role test_role in database test_db set search_path = test_schema_2, test_schema_1;
alter database test_db set search_path = test_schema_1, test_schema_2;
первый скажет, что под юзером, на которого намаплена роль test_role ищи сперва в схеме test_schema_2, затем по цепочке
а что сделает второй? что он зааффектит?

Google

Tolya
03.04.2018
17:09:26
Правда никто не знает?:)

Петр
03.04.2018
17:30:54
Смотря от какого пользователя выполняются команды. Если в конфликт войдут, то альтер роли в приоритете будет.
Мону ошибаться. Посмотрите в доке.

Tolya
03.04.2018
18:37:22
В доке не нашёл никаких разъяснений
Не уверен, что они там есть вообще
Судя по экспериментам пользователю все равно на search_path бд в любом случае
Тем более у него всегда есть две дефолтные схемы, не совсем понял какой конфликт?

Admin
ERROR: S client not available

Tolya
03.04.2018
18:38:51
Конфликт чего с чем?

Петр
03.04.2018
19:00:53
не поленился, глянул в доку
вот
https://www.postgresql.org/docs/current/static/sql-alterdatabase.html
гляньте в Notes

Sergey
03.04.2018
19:16:32
есть запрос он выполняеться более 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';
таблицы индексированы


Tolya
03.04.2018
19:19:07
на тестах, правда, все наоборот опять же
если проставить схему для роли и для базы, берет схему для базы, хотя в доке должен брать в приоритет схему для роли
вот полный скрипт, тыкните плиз, где я что-то упустил
create database test_db;
\c tet_db
create schema test_schema_1;
create schema test_schema_2;
create user test_user;
alter user test_user with password 'test_user';
create user test_user2;
alter user test_user2 with password 'test_user2';
create role test_role;
alter user test_user set role test_role;
alter role test_role in database test_db set search_path = test_schema_2, test_schema_1;
alter database test_db set search_path = test_schema_1, test_schema_2;
create table test_schema_1.test_table(data text);
insert into test_schema_1.test_table values('test_table_1');
grant select on table test_schema_1.test_table to test_user;
grant select on table test_schema_1.test_table to test_user2;
create table test_schema_2.test_table(data text);
insert into test_schema_2.test_table values('test_table_2');
grant select on table test_schema_2.test_table to test_user;
grant select on table test_schema_2.test_table to test_user2;
grant usage on schema test_schema_1 to test_user;
grant usage on schema test_schema_1 to test_user2;
grant usage on schema test_schema_2 to test_user;
grant usage on schema test_schema_2 to test_user2;
\q
при коннекте psql -h 0.0.0.0 -p 5432 -U test_user -d test_db -W вижу, что все наоборот
нашел ответ, посмотрев на обрезанный кусок скрина)
всем спасибо)

Google

Yaroslav
03.04.2018
19:33:35
есть запрос он выполняеться более 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';
Ээээ.... не выполнять 5000 раз? ;)
Т.е. 5000 раз индентичный запрос, или что-то всё же меняется? Затем, нельзя ли эти 5000 переписать в один запрос?

Аггей
03.04.2018
19:43:02
golang.session_id как индексирован?

Sergey
03.04.2018
19:43:23
CREATE INDEX session_id_idx ON golang (session_id);

Аггей
03.04.2018
19:43:29
Смотрю index_scan там тяжеловат
Если попробовать HASH индекс?
Только прочитайте про него внимательно предварително
Подойдет ли вам

Sergey
03.04.2018
19:45:33
спасибо почитаю

Yaroslav
03.04.2018
19:46:35


Vladimir
03.04.2018
19:52:03
есть запрос он выполняеться более 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';
В запросе связанные переменные используются? Или он прямо так? Либо нужно связанные переменные (при условии что будет server-side prepared statement), либо можно завернуть запрос в pl/pgsql -- там server prepared начнут использоваться


Evgeniy
03.04.2018
22:08:36
прошлые советчики советую сделать индекс который есть, и даже не видят что запрос выполняется в очень достойное время
но так как время планирования превышает время выполнения в три-четыре раза, посоветовать вам можно только перейти на препаред запросы, а если и это не понравится, то на кеш ближе к апликухе

Аггей
04.04.2018
04:54:10
Хотя тут вероятно session_id уникальный (для этого конкретного значения - rows 1) или близкий к тому

Eugeny
04.04.2018
05:29:05

Аггей
04.04.2018
05:42:13
Ну тут же от задачи зависит.

Sergey
04.04.2018
05:55:44
В итоге перетпшил таблицу в оперативную память и переделал логику. Спасибо за советы.