Size: a a a

2021 June 09

ММ

Максим Мартынов... in pro.elixir
во-первых я все еще не понимаю, зачем тебе это делать и почему нельзя передать просто в subquery
источник

ММ

Максим Мартынов... in pro.elixir
во-вторых, обычно оптимизатор запросов в БД достаточно умный для того, чтобы уметь пробрасывать ограничения из родительского запроса в дочерний без явного на то указания. но возможно тут я не прав
источник

B

Bogdan in pro.elixir
потому-что есть много rows A, и для каждой есть свой :last_id
источник

ММ

Максим Мартынов... in pro.elixir
много это сколько?
источник

ММ

Максим Мартынов... in pro.elixir
если речь скажем о десятках, максимум сотне, то почему бы не передать их через a.id in (1, 2, 3)
источник

ММ

Максим Мартынов... in pro.elixir
если больше, то уже боль (хотя оно и так выглядит больно). я бы вообще задумался над архитектурой, зачем в принципе так делать. и если из-за бизнес-логики этого не избежать, а записей много, то почему бы не рассмотреть вариант денормализации части данных. чуть больше места на диске и чуть дольше запись в таблицу, но чтение будет гораздо эффективнее, а если это основная часть нагрузки на приложение, то профит очевиден
источник

ММ

Максим Мартынов... in pro.elixir
в чем вообще верхнеуровневое описание задачи?
источник

B

Bogdan in pro.elixir
Если сейчас запихать это в одну query то вся боль будет решена c хорошим запасом.
источник

B

Bogdan in pro.elixir
on: b.id > a.last_id AND b.id < a.last_id + 3500

вот этот вариан гуд реально, но просто как быть с ямами в индексации я пока не ншел идеи)
источник

ММ

Максим Мартынов... in pro.elixir
AND b.id > (SELECT MAX(id) FROM (SELECT id FROM b WHERE id > a.last_id ORDER BY id ASC LIMIT 3500))?
источник

ММ

Максим Мартынов... in pro.elixir
но выглядит отвратительно
источник

B

Bogdan in pro.elixir
понять бы как это в ecto перевести)
источник

B

Bogdan in pro.elixir
сейчас пойду наверное опять LATERAL пробовать хз
источник

B

Bogdan in pro.elixir
вроде все должно бы было быть просто)
источник

ММ

Максим Мартынов... in pro.elixir
работал бы row_number в where условии и уже после order by, может быть и было бы проще. но sql стандарт к такому строг
источник

B

Bogdan in pro.elixir
или в filter row_number засовывался бы
источник

ММ

Максим Мартынов... in pro.elixir
да и этот способ точно был бы ни разу не производительнее, базе ведь пришлось бы выполнять ровно те же самые операции
источник

ММ

Максим Мартынов... in pro.elixir
если бы и был, он срабатывает раньше order by, поэтому это бесполезно - ты бы выбрал 3500 каких-то строк, подходящих под условие, но хз каких именно
источник

B

Bogdan in pro.elixir
получилось решить, чтобы в subquery передать параметр ее нужно было добавлять как fragment.
источник

B

Bogdan in pro.elixir
но чот медленно оно работает))
источник