powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Какие индексы сделать под запрос с join или как улучшить архитектуру?
7 сообщений из 7, страница 1 из 1
Какие индексы сделать под запрос с join или как улучшить архитектуру?
    #39081236
zzox4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 2 таблицы:

request: (Запросы/заказы)
- id
- product_id
- shop_id
- customer_id

customer_name: (Имя клиента в разрезе пользователя)
- customer_id
- user_id
- name

(Нужно вывести список запросов с фильтром по shop_id, и сортировкой по имени клиента)

SELECT c.name, r.* FROM request r
LEFT OUTER JOIN customer_name c ON c.customer_id = r.customer_id AND c.user_id = 'yyy'
WHERE c.shop_id = 'xxx'
ORDER BY c.name
LIMIT 20
OFFSET 20

Дак вот есть подозрение, что сервер умрет на таком запросе если будет много (миллион) строк.

Даже если будет индекс на customer_name с сортировкой по name и фильтрами (user_id, curstomer_id), серверу все равно придется сначала в памяти сформировать временный результат из request (SELECT FROM request r WHERE c.shop_id = 'xxx'), а это может быть миллион строк, далее пойдет процесс "пристыковки" сортированной таблицы customer_name, и от сюда уже возьмется только 20 строк.
...
Рейтинг: 0 / 0
Какие индексы сделать под запрос с join или как улучшить архитектуру?
    #39081252
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zzox4есть подозрениеесть подозрение, что компания с миллионами заказов найдет денег нанять специалистов, способных спроектировать работающую систему.
а тему то заводил для чего, поделиться подозрениями или чтобы ткнули в избыточную левость запроса?
...
Рейтинг: 0 / 0
Какие индексы сделать под запрос с join или как улучшить архитектуру?
    #39081267
Author the new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zzox4,

Скажите пожалуйста, зачем вам request r LEFT OUTER JOIN customer_name c, если вы тут же пишете WHERE c.shop_id = 'xxx' ? Проблемы будут как раз из-за этого.
...
Рейтинг: 0 / 0
Какие индексы сделать под запрос с join или как улучшить архитектуру?
    #39081285
zzox4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2. чтобы ткнули в избыточную левость запроса?
левость тут не избыточна - таблица customer_name может быть пустой, но заказы выдать все равно нужно.

p2. а тему то заводил для чего,
Что-б спецы подсказали, есть ли решение лучше (этого решения "в лоб"), либо подтвердили, что sql тут "сосет".

если описать задачу на пальцах - клиенты делают заказы, а сотрудники захотели именовать клиентов по своему - сотрудники именуют одних и тех же клиентов по своему (и именования других сотрудников им показывать нельзя), в результирующей таблице нужна возможность сортировать заказы по клиенту.
...
Рейтинг: 0 / 0
Какие индексы сделать под запрос с join или как улучшить архитектуру?
    #39081287
zzox4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скажите пожалуйста, зачем вам request r LEFT OUTER JOIN customer_name c, если вы тут же пишете WHERE c.shop_id = 'xxx' ? Проблемы будут как раз из-за этого.
Упс, опечатка, нужно фильтровать заказы по магазину (WHERE r.shop_id = 'xxx'):

SELECT c.name, r.* FROM request r
LEFT OUTER JOIN customer_name c ON c.customer_id = r.customer_id AND c.user_id = 'yyy'
WHERE r.shop_id = 'xxx'
ORDER BY c.name
LIMIT 20
OFFSET 20
...
Рейтинг: 0 / 0
Какие индексы сделать под запрос с join или как улучшить архитектуру?
    #39081314
zzox4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В крайнем случае можно для этого держать кеш-таблицу с нужными индексами, но это не "интересно" - в этом случае psql со своими джойнами не лучше чем какой-нибудь nosql.
...
Рейтинг: 0 / 0
Какие индексы сделать под запрос с join или как улучшить архитектуру?
    #39081340
Author the new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zzox4,

Ну строите индексы по r.shop_id, по c.customer_id, c.user_id и в путь. На нормальном железе с разумным количеством заказов (кстати, откуда у вас миллионы? Если заказ выполнен, то чего на него смотреть?) будет вполне приемлемо. Можно, конечно, сначала сделать индекс r.shop_id, r.id, r,customer_id и сначала выбирать первичные ключи заказов и поднимать их юзерские имена, сортировать их, вырезать нужный кусок и уж только потом лезть за остальными данными (т.е. за r.*). Многого вы тут не выиграете, впрочем.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Какие индексы сделать под запрос с join или как улучшить архитектуру?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]