Size: a a a

pgsql – PostgreSQL

2021 March 01

V

V in pgsql – PostgreSQL
Yaroslav Schekin
Тогда покажите версию PostgreSQL, новый план и "\d performed_actions".
^
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
V
^
Так тут вообще никакого индекса по created_at нет, а из других условий фильтрации (чтобы postgres мог как-то эффективно "перевернуть" запрос) — только (r.long_service_alert_interval IS NOT NULL) и (t.finished_at IS NULL), если они не селективные — на что Вы надеетесь?
источник

V

V in pgsql – PostgreSQL
Yaroslav Schekin
Так тут вообще никакого индекса по created_at нет, а из других условий фильтрации (чтобы postgres мог как-то эффективно "перевернуть" запрос) — только (r.long_service_alert_interval IS NOT NULL) и (t.finished_at IS NULL), если они не селективные — на что Вы надеетесь?
на локальной базе пробовал создать btree по pa.created_at, но все равно показывало seq scan
источник

V

V in pgsql – PostgreSQL
V
на локальной базе пробовал создать btree по pa.created_at, но все равно показывало seq scan
хотя локально конечно там не 6млн записей а 6к
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
V
хотя локально конечно там не 6млн записей а 6к
Значит, там вообще правильно планировалось.
А ещё вот что — какой процент записей таблицы выбирается по этому условию?
Если существенный (какой именно, зависит и от "железа"), то от использования индекса будет только хуже.
источник

V

V in pgsql – PostgreSQL
Yaroslav Schekin
Значит, там вообще правильно планировалось.
А ещё вот что — какой процент записей таблицы выбирается по этому условию?
Если существенный (какой именно, зависит и от "железа"), то от использования индекса будет только хуже.
процент мизерный, пара тысяч записей максимум, но чаще всего в пределах нескольких сотен
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
V
процент мизерный, пара тысяч записей максимум, но чаще всего в пределах нескольких сотен
Хмм... а как так выходит, что почти все записи — новые (добавлены в последние 20 минут)?
источник

V

V in pgsql – PostgreSQL
Yaroslav Schekin
Хмм... а как так выходит, что почти все записи — новые (добавлены в последние 20 минут)?
всмысле?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
V
всмысле?
(now() - pa.created_at) >= interval '20 minutes'
источник

V

V in pgsql – PostgreSQL
Yaroslav Schekin
(now() - pa.created_at) >= interval '20 minutes'
ну из этих миллионов мы должны вытащить записи об обслуживаниях которые начались более 20 минут назад и до сих пор не закончились
источник

V

V in pgsql – PostgreSQL
Yaroslav Schekin
(now() - pa.created_at) >= interval '20 minutes'
более читаемое условие -
pa.created_at < now() - interval '20 minutes'
, как вы сами предложили
источник

V

V in pgsql – PostgreSQL
на деле интервал будет не хардкодным а доставаться из другой таблицы, просто ее пока нет на проде
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
V
более читаемое условие -
pa.created_at < now() - interval '20 minutes'
, как вы сами предложили
И почти все записи в подобных таблицах обычно попадают под такие условия, потому что "старых" записей обычно гораздо больше, чем "новых".
Почему в этом случае не так? Они удаляются, или в чём дело?
источник

V

V in pgsql – PostgreSQL
Yaroslav Schekin
И почти все записи в подобных таблицах обычно попадают под такие условия, потому что "старых" записей обычно гораздо больше, чем "новых".
Почему в этом случае не так? Они удаляются, или в чём дело?
почти все записи попадают под условие "созданы за последние 20 минут"? кажется мы где-то потеряли взаимопонимание
источник

V

V in pgsql – PostgreSQL
V
почти все записи попадают под условие "созданы за последние 20 минут"? кажется мы где-то потеряли взаимопонимание
хотя кажется мы неправльно отрефакторили условие
источник

V

V in pgsql – PostgreSQL
должно быть так - с момента создания прошло больше 20 минут, и finished_at is null
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
V
почти все записи попадают под условие "созданы за последние 20 минут"? кажется мы где-то потеряли взаимопонимание
Вы условие своё прочитайте. ;)
Или просто посмотрите сюда:
https://dbfiddle.uk/?rdbms=postgres_13&fiddle=f11e92d55896434d5639e062a1dd3f8a
источник

V

V in pgsql – PostgreSQL
фигасе, никогда не слышал про dbfiddle :)
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
V
должно быть так - с момента создания прошло больше 20 минут, и finished_at is null
Раз "с момента создания прошло больше 20 минут" — Вам нужны старые записи, как я и писал, нет?
источник

V

V in pgsql – PostgreSQL
Yaroslav Schekin
Раз "с момента создания прошло больше 20 минут" — Вам нужны старые записи, как я и писал, нет?
да, вы правы
источник