Эффективный запрос объединения OSQL из двух классов от одного и того же предка

У меня есть сложная иерархия классов этой формы:

- A (common ancestor)
    * B
    - C
        * D
        * E
    * F
    - G
        * H
        * I

Из моего приложения мне нужен такой запрос:

SELECT FROM D
WHERE ...

Но недавно я хотел бы также сделать такой запрос:

SELECT FROM A
WHERE @class IN ['D', 'I'] AND ...

Мой вопрос заключается в том, насколько эффективен этот последний запрос и как лучше его оптимизировать.

2 ответа

Решение

Пробуя ваш запрос с образцом набора данных, который я создал

SELECT FROM A
WHERE @class IN ['D', 'I']

и я вижу время выполнения от 40 мс (холодный кэш) до 15 мс (горячий кеш).

Вместо этого я вижу улучшение (3 мс с горячим кешем):

select expand($c)

let $a=(SELECT FROM D),
$b=(SELECT FROM I),
$c=unionAll($a,$b)

РЕДАКТИРОВАТЬ

Вот запрос с использованием условий WHERE и LIMIT:

select from (
  select expand($c)

  let $a=(SELECT FROM D),
  $b=(SELECT FROM I),
  $c=unionAll($a,$b)
  )
where value = 5 LIMIT 10

Надеюсь, поможет. Иван

Я заявляю, что не знаю, понял ли я смысл вашего вопроса. Я понял, что вы хотите знать, быстрее ли выполняется запрос с помощью SELECT FROM A WHERE @class IN ['D', 'I'].

Я сделал тест с 5000 записей для класса A, 5000 для класса B, 5000 для класса C и т.д...

С запросом SELECT FROM A WHERE @class IN ['D', 'I'] limit -1

С запросом SELECT EXPAND( $c ) LET $a = ( SELECT FROM D ), $b = ( SELECT FROM I ), $c = UNIONALL( $a, $b ) limit -1

Второй запрос должен быть быстрее, потому что он не выбирает все записи класса A (45000), а затем оценивает предложение where, но только записи 5000 типа D и 5000 типа I

Другие вопросы по тегам