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