Эффективный запрос объединения 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 ...

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


person riccardo.tasso    schedule 09.03.2016    source источник


Ответы (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

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

person Ivan Mainetti    schedule 09.03.2016
comment
Это кажется хорошим, но что, если мой запрос станет: SELECT FROM A WHERE @class IN ['D', 'I'] AND value = 5 LIMIT 10? - person riccardo.tasso; 11.03.2016

Я заявляю, что не знаю, понял ли я смысл вашего вопроса. Я так понял, вы хотите знать, будет ли запрос быстрее с 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.

person Alessandro Rota    schedule 09.03.2016