
Terminator
18.10.2018
14:37:56
@Seempoke будет жить. Поприветствуем!

Sab0
18.10.2018
15:01:46
ребят, а постгрес после установки смотрит в мир? по какому порту?

Mike Chuguniy
18.10.2018
15:02:40

Alex
18.10.2018
15:08:01
по дефолту не смотрит

Google

Sab0
18.10.2018
15:09:13
я просто пытаюсь настроить omnidb и не понимаю какой порт указать(

Mike Chuguniy
18.10.2018
15:09:39
Да

Terminator
18.10.2018
15:37:55
@amelkor будет жить. Поприветствуем!

Alexey
18.10.2018
15:39:13
Может кто-нибудь пояснить фичу jit compilation в 11-ой версии? или ссылку дать на ресурс, где можно прочитать про это.
Т.е. как это работает и почему это даёт прирост производительности.

Darafei
18.10.2018
15:41:11
они пишут сишный код, который выполняет твой запрос, и компилируют
а потом проход оптимизирующего компилятора вырезает все однозначные для твоего случая ифы

Alexey
18.10.2018
15:42:41
Т.е. там до 10-ой была интерпретация

Darafei
18.10.2018
15:44:14
http://www.pgcon.org/2017/schedule/attachments/467_PGCon%202017-05-26%2015-00%20ISPRAS%20Dynamic%20Compilation%20of%20SQL%20Queries%20in%20PostgreSQL%20Using%20LLVM%20JIT.pdf

Alexey
18.10.2018
15:45:02
@Komzpa, спасибо
Хм... а почему тогда всякие питоны, перлы, руби и т.д. так не делают?)
На сколько я знаю они все компилируют/транслируют в интерпретируемый байткод

Stanislav
18.10.2018
15:47:36
ну pl\sql тоже конвертирует/упаковывает, но всегда можно и обратно распаковать.

Google

Fike
18.10.2018
15:47:43

Darafei
18.10.2018
15:48:17

Fike
18.10.2018
15:49:13
Хм... а почему тогда всякие питоны, перлы, руби и т.д. так не делают?)
Потому что там не хватает рук и мозгов для такого, плюс у JIT есть серьезные пенальти на первое выполнение, там по-хорошему надо интерпретировать и в параллель компилить. Жаба так делает, и там реально огромное болото подводных камней, через которое пришлось пройти, чтобы добиться текущих результатов.
Подозреваю, что в БД будет чуть проще, чем в ЯП, потому что не нужно никакого escape analysis и прочего, глубина инлайнинга заранее известна и т.п.

Darafei
18.10.2018
15:51:24
у тебя ровно один вызов функции, и требуется "как можно быстрее" (а не "поинтерактивнее", "без замираний", "без долгого старта")

Alexey
18.10.2018
15:51:47

Darafei
18.10.2018
15:52:58

Fike
18.10.2018
15:53:46
При желании можно любой повторяющийся паттерн перегнать в чистый машинный код, которому не нужно контролировать интерпретатор вообще. Насколько понимаю, v8 так делает, и hidden classes именно оттуда и берут свое начало.

Terminator
18.10.2018
15:54:23
@johnspade будет жить. Поприветствуем!

Alexey
18.10.2018
15:55:45

Fike
18.10.2018
15:56:00
С "не нужно контролировать интерпретатор" наверное перегнул, но многие вещи можно легко делать в обход рантайма, экономля как на структурах данных, так и на скорости выполнения, e.g. локальные переменные можно вообще на регистрах хранить.

Alexey
18.10.2018
15:56:05
Хотя как посмотреть. Там время старта дольше

Darafei
18.10.2018
15:56:48

Alexey
18.10.2018
15:57:50
Моём? я не пользуюсь pypy. Просто вроде как логично, что в случае cpython там транслирование, а в случае pypy там транслирование в си и компилирование.
Ладно, всем спасибо
Зачем в что-то транислировать. Почему бы не сразу компилировать?
Может потому что компиляторы c/с++ имеют свои оптимизаторы всякие, которые накладно писать?

Darafei
18.10.2018
16:17:42

Alexey
18.10.2018
16:18:22

Terminator
18.10.2018
16:38:32
@Trey55 будет жить. Поприветствуем!

Google

F
18.10.2018
18:21:05
Как и было запланировано, 18 октября вышла 11 версия PostgreSQL. Основные нововведения:
✓ Партицирование по хешу
✓ Поддержка первичных и внешних ключей, индексов на партицированных таблицах
✓ UPDATE строки по ключу партицирования перемещает данные в нужную партицию
✓ Улучшение производительности SELECT запросов на партицированных таблицах (доработан planner и executor)
✓ B-Tree индекс теперь может создаваться в несколько потоков
✓ CREATE TABLE ... AS, CREATE MATERIALIZED VIEW и некоторые запросы с UNION теперь также могут распараллеливаться
✓ Улучшена производительность параллельных hash join и seq scan
✓ Можно управлять транзакцией внутри хранимой процедуры
✓ JIT компиляция SQL кода
✓ Оконные функции теперь поддерживают некоторые нововведения стандарта SQL:2011
✓ Поддержка INCLUDE для покрывающий индексов
✓ Размер WAL сегмента теперь можно задавать во время инициализации кластера
✓ Многочисленные улучшения производительности
И многое, многое другое.


Sergey
18.10.2018
19:35:54
Даешь докер-образ!

Oleg ?
19.10.2018
04:44:23
SELECT discussions.id,
count(discussions_answers.id) AS answers,
discussions_topics.text,
user_forms.name,
discussions.user_id,
discussions.status,
discussions_topics.updated_at
FROM (((discussions
LEFT JOIN discussions_answers ON ((discussions_answers.discussions_id = discussions.id)))
JOIN discussions_topics ON ((discussions_topics.discussions_id = discussions.id)))
LEFT JOIN user_forms ON ((user_forms.user_id = discussions.user_id)))
WHERE (discussions.status = 1)
GROUP BY discussions.id, user_forms.name, discussions_topics.updated_at, discussions_topics.text
LEFT JOIN user_forms ON ((user_forms.user_id = discussions.user_id)))
как указать, чтобы он брало только последнюю строку из всех ассоциаций?

Ivan
19.10.2018
05:14:03
order by x desc limit 1?

Oleg ?
19.10.2018
05:14:55
а как вставить правильно в запрос?
я впервые их пишу

Ivan
19.10.2018
05:15:59
Они вставляются в конец запроса. Приятного изучения документации https://postgrespro.ru/docs/postgrespro/10/sql-select

Oleg ?
19.10.2018
05:16:48
мммм
я именно в джоин не оч понима.
у меня ошибку возвращает
я вроде прочитал и правильно сделал
сейчас вот сижу читаю как джоины работают, а то я достаточно абстрактно представляю

Ivan
19.10.2018
05:19:25
Скобочек столько можно не ставить в условиях, читаться проще будет

Oleg ?
19.10.2018
05:20:32
ой да
спасибо
LEFT JOIN ( SELECT "name" FROM user_forms ORDER BY "user_forms.id" DESC LIMIT 1 ) ON "public".user_forms."user_id" = "public".discussions."user_id" AS user_forms
не работает
ERROR: subquery in FROM must have an alias
LINE 13: LEFT JOIN ( SELECT "name" FROM user_forms ORDER BY "user_f...

Google

Oleg ?
19.10.2018
05:46:51
не понимаю как именно это делать?

Yaroslav
19.10.2018
06:04:04
не понимаю как именно это делать?
Написано же:
> subquery in FROM must have an alias
Вообще любой subquery в FROM должен как-то называться.
Но у Вас всё равно неправильно, похоже — Вы отбираете первую запись в порядке "user_forms.id", а потом пытаетесь её JOIN-ить.

Oleg ?
19.10.2018
06:04:27
это факт
а как правильно?
логически проблема в том, что я беру конкретную строку, вместо таблицы7

Yaroslav
19.10.2018
06:06:44
а как правильно?
Наверное, как-то так:
LEFT JOIN LATERAL (SELECT name FROM user_forms WHERE user_forms.user_id = discussions.user_id ORDER BY user_forms.id DESC LIMIT 1) AS something

Oleg ?
19.10.2018
06:07:25
а вот as something - это как использовать? мне в гропу писать что-то типа something.name?


Alexey
19.10.2018
06:08:35
Если я вас правильно понял, то вам нужно что-то вроде такого:
SELECT discussions.id,
count(discussions_answers.id) AS answers,
discussions_topics.text,
user_forms.name,
discussions.user_id,
discussions.status,
discussions_topics.updated_at
FROM discussions
LEFT JOIN discussions_answers ON discussions_answers.discussions_id = discussions.id
JOIN discussions_topics ON discussions_topics.discussions_id = discussions.id
lateral LEFT JOIN (
select user_forms.*
from user_forms
where user_forms.user_id = discussions.user_id
order by user_forms.user_id desc
limit 1
) as user_forms
WHERE discussions.status = 1
GROUP BY discussions.id, user_forms.name, discussions_topics.updated_at, discussions_topics.text
Если я вас правильно понял, то вам нужно что-то вроде такого:
SELECT discussions.id,
count(discussions_answers.id) AS answers,
discussions_topics.text,
user_forms.name,
discussions.user_id,
discussions.status,
discussions_topics.updated_at
FROM discussions
LEFT JOIN discussions_answers ON discussions_answers.discussions_id = discussions.id
JOIN discussions_topics ON discussions_topics.discussions_id = discussions.id
lateral LEFT JOIN (
select user_forms.*
from user_forms
where user_forms.user_id = discussions.user_id
order by user_forms.user_id desc
limit 1
) as user_forms
WHERE discussions.status = 1
GROUP BY discussions.id, user_forms.name, discussions_topics.updated_at, discussions_topics.text
Выше Yaroslav слово lateral поставил после left join. Посмотрите доку, в какое место нужно поставить.


Oleg ?
19.10.2018
06:10:22
я вот уже сижу и разбираю на куски, что прочитать )
сейчас тест прогоню и пойду понимать, как это работает
как раз об этом, да?

Alexey
19.10.2018
06:11:44
Видимо

Oleg ?
19.10.2018
06:12:18
Видимо
а если как Ярослав, то ERROR: syntax error at or near "WHERE"
LINE 18: WHERE discussions.status = 1
^

Alexey
19.10.2018
06:13:59
Условие нету
нужно ещё on true написать
SELECT discussions.id,
count(discussions_answers.id) AS answers,
discussions_topics.text,
user_forms.name,
discussions.user_id,
discussions.status,
discussions_topics.updated_at
FROM discussions
LEFT JOIN discussions_answers ON discussions_answers.discussions_id = discussions.id
JOIN discussions_topics ON discussions_topics.discussions_id = discussions.id
LEFT JOIN lateral (
select user_forms.*
from user_forms
where user_forms.user_id = discussions.user_id
order by user_forms.user_id desc
limit 1
) as user_forms on true
WHERE discussions.status = 1
GROUP BY discussions.id, user_forms.name, discussions_topics.updated_at, discussions_topics.text

Oleg ?
19.10.2018
06:15:49
вроде работает

Google

Oleg ?
19.10.2018
06:15:59
у меня ещё сработало, когда я на cross join поменял
SELECT discussions.id,
count(discussions_answers.id) AS answers,
discussions_topics.text,
user_forms.name,
discussions.user_id,
discussions.status,
discussions_topics.updated_at
FROM discussions
LEFT JOIN discussions_answers ON discussions_answers.discussions_id = discussions.id
JOIN discussions_topics ON discussions_topics.discussions_id = discussions.id
CROSS JOIN LATERAL (
select user_forms.*
from user_forms
where user_forms.user_id = discussions.user_id
order by user_forms.user_id desc
limit 1
) as user_forms
WHERE discussions.status = 1
GROUP BY discussions.id, user_forms.name, discussions_topics.updated_at, discussions_topics.text
вот так
а как правильней?

Alexey
19.10.2018
06:17:59
Зависит от того, что вам нужно ?,
Вам нужен left join или inner join?

Oleg ?
19.10.2018
06:19:14
сама задача у меня - это сделать db view к которой потом обращаться из откуда-то и я честно говоря вчера узнал только что такое бывает

Alexey
19.10.2018
06:19:24
Возможно тут как раз без разницы)

Oleg ?
19.10.2018
06:19:59
до этого всегда как-то так получалось, но там овер 200 запросов если через Элокнет на страницу из 30 топиков
А тут как бы один
хорошо, буду пользоваться так
спасибо большое
❤️

Alexey
19.10.2018
06:28:37
Возможно тут как раз без разницы)
Есть разница:
test=# create table x(a int);
CREATE TABLE
test=# create table y(x int);
CREATE TABLE
test=# insert into x values (1);
INSERT 0 1
test=# select * from x left outer join lateral ( select * from y where x.a = y.x) as t on true;
a | x
---+---
1 |
(1 row)
test=# select * from x cross join lateral ( select * from y where x.a = y.x) as t;
a | x
---+---
(0 rows)
test=#

Сергей
19.10.2018
06:37:37
Всем привет, а кто администратор в чате? Есть вопрос)