Оптимизация иерархического запроса - PullRequest
0 голосов
/ 10 января 2012

У меня есть глубокая иерархическая модель, которая выглядит следующим образом:

Счета -> Места проведения -> События -> Списки гостей -> Билеты

И мне нужно сделать запрос, в котором я выбираю заявки на основе родительских списков гостей ИЛИ событий, ИЛИ мест проведения ИЛИ учетных записей, чтобы это выглядело примерно так:

Запрос:

select * from user_detail ud, venue v, event e, guest_list g, ticket t

where

    t.guest_list = g.id
    and g.event = e.id
    and e.venue = v.id

    and (
        ud.guest_list = t.guest_list
        or ud.event = g.event
        or ud.venue = e.venue
        or ud.account = v.account
    )

Это, конечно, очень дорогой запрос, и, поскольку у меня есть миллионы билетов, - это не совсем так, как я надеялся.

Неидеальное решение (хранение избыточных родительских ссылок на уровне заявки)

Решение, о котором я думаю, состоит в том, чтобы оптимизировать это путем сохранения не только прямого родителя, но и всех супер-родителей в строке заявок, поэтому вместо ссылки только на таблицу списка гостей я бы также сослался на родительские события, место проведения и счет за каждый билет. Несмотря на то, что это было бы довольно просто выполнить, это означает, что я буду хранить избыточные данные, а смена родителя может быть хлопотной и подверженной ошибкам.

Идеальное решение (все, что не требует избыточных данных)

Есть предложения?

1 Ответ

3 голосов
/ 10 января 2012

Один из самых популярных способов повышения производительности OR - просто использовать UNION ALL.

. Итак, разбейте ваш запрос на 4 (каждый с одним объединением) и UNION ALL их

Кроме того, я надеюсь, что t.guest_list, g.event, e.venue и v.account покрыты индексами, не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...