172 похожих чатов

Ребят, нужна помощь) есть таблица products, в ней есть индексы: - products_created_by_id_updated_at__partial_idx

(where deleted_at IS NULL)
- products_created_by_id_idx
- index_products_on_title

есть достаточно простая кверя:

SELECT "products".* FROM "products" INNER JOIN "users" ON "products"."created_by_id" = "users"."id" WHERE "users"."company_id" = 1422 AND "products"."deleted_at" IS NULL ORDER BY "products"."title" ASC LIMIT 10 OFFSET 0

На массиве данных отрабатывает чудовищно долго, 2 минуты. Explain этого запроса: https://explain.dalibo.com/plan/qU . Судя по тому что я тут вижу, для выборки по created_by_id почему-то (очевидно из-за сортировки, но все же) используезтся индекс on_title вместо любого из created_by_id_*.

Есть другая кверя, где к INNER JOIN я добавил подзрапрос по created_by_id на уровне таблицы products:

SELECT "products".* FROM "products" INNER JOIN "users" ON "products"."created_by_id" = "users"."id" WHERE "users"."company_id" = 1422 AND "products"."deleted_at" IS NULL AND "products"."created_by_id" IN (SELECT "users"."id" FROM "users" WHERE "users"."company_id" = 1422) ORDER BY "products"."title" ASC LIMIT 10

Работает быстро: https://explain.dalibo.com/plan/E80 , используется индекс по products_created_by_id_updated_at__partial_idx

Но тут INNER JOIN по большому счету ведь не нужен, можно оставить только subquery, подумал я:

SELECT "products".* FROM "products" WHERE "products"."deleted_at" IS NULL AND "products"."created_by_id" IN (SELECT "users"."id" FROM "users" WHERE "users"."company_id" = 1422) ORDER BY "products"."title" ASC LIMIT 10

Но не тут то было, explain точно такой же как в первом варианте - https://explain.dalibo.com/plan/OxV , нужный индекс не используется.

Очевидным и напрашивающимся решением было бы добавить индекс по created_by_id + title (тем более что created_by_id тут выступает в роли TenantID), что я и сделал:

CREATE INDEX CONCURRENTLY products_created_by_id_title_idx ON products (created_by_id, title) WHERE (deleted_at IS NULL)

Но это не помогло, постгря его игнорирует. Так же игнорирует и обратный индекс (on title, on created_by_id)

Я не понимаю почему JOIN + Subquery вместе делают кверю быстрой, а по отдельности нет. И как бы обойтись только чем-то одним. Есть идеи? За любую подсказку в каком направлении копать буду признателен.

1 ответов

11 просмотров

Есть вот такая идея — все эти планы бесполезны для анализа. ;) Выложите лучше EXPLAIN (ANALYZE, BUFFERS) на https://explain.depesz.com/ Ах да, и определения индексов мы должны угадать из их названий? Покажите лучше \d products и \d users.

Похожие вопросы

Обсуждают сегодня

Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
48
привет всем. Народ, кто-нибудь работал с мультипоточностью? Где посмотреть/ что почитать посоветуете? В идеале чтоб материал был максимально сжатый, времени читать например в...
Serg Vish
17
Всем привет! Скажите, никто не пытался уменьшить размер процесса ssl, которые ассоциируется с открытым соединением (не помню точное название этого процесса, но там была какая-...
Алексей
20
This is a big issue. Just by being a citizen of a country, you are denied to contribute to Open Source software: https://youtu.be/L5Ec5jrpLVk?si=1iIuHnMPbCB4anV-
Sharuzzaman Ahmat Raslan
72
а проверьте, собирается ли у кого сейчас транк лазаря через делюкс? у меня вот: fpcupdeluxe: info: Lazarus Native Installer (BuildModuleCustom: UserIDE): LazBuild: building Us...
Iluha Companets
20
добрый день. возможно ли изменить цвет окон лазаруса? Как?
Budemposmotret
35
Мне тут приспичило встроить в программу форматировние текста SQL, расставить переносы строк и отступы так, чтобы лучше читалось. Я что-то свое изобразил, оно после ключевых сл...
Sergey Bodrov
11
А какие существуют способы обработки ошибок выделения памяти в ядре? Т.е., допустим, есть функция, которая возвращает адрес свободной страницы в физической памяти и диапазон в...
disba1ancer
51
Господа, а кто-нибудь сталкивался с размещением на TTabControl/TTabSheet множества контролов (> 100) с последующими External: Access violation? Вот буквально на ровном месте. ...
Dmitry
29
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
12
Карта сайта