Подзапросы

Manticore поддерживает подзапросы SELECT через SQL в следующем формате:

SELECT * FROM (SELECT ... ORDER BY cond1 LIMIT X) ORDER BY cond2 LIMIT Y

Внешний SELECT допускает только клаузы ORDER BY и LIMIT. В настоящее время подзапросы имеют два варианта использования:

  1. Когда у вас есть запрос с двумя ранжирующими UDF, один очень быстрый, а другой медленный, и выполняется полнотекстовый поиск с большим набором результатов. Без подзапроса запрос выглядел бы так:

     SELECT id,slow_rank() as slow,fast_rank() as fast FROM index
         WHERE MATCH(‘some common query terms’) ORDER BY fast DESC, slow DESC LIMIT 20
         OPTION max_matches=1000;

    С подзапросами запрос можно переписать так:

     SELECT * FROM
         (SELECT id,slow_rank() as slow,fast_rank() as fast FROM index WHERE
             MATCH(‘some common query terms’)
             ORDER BY fast DESC LIMIT 100 OPTION max_matches=1000)
     ORDER BY slow DESC LIMIT 20;

    В исходном запросе UDF slow_rank() вычисляется для всего набора результатов. С подзапросами SELECT fast_rank() вычисляется для всего набора результатов, а slow_rank() — только для ограниченного набора.

  2. Второй случай полезен для больших наборов результатов, получаемых из распределённой таблицы.

    Для этого запроса:

     SELECT * FROM my_dist_index WHERE some_conditions LIMIT 50000;

    Если у вас 20 узлов, каждый узел может отправить мастеру максимум 50K записей, что в сумме даёт 20 x 50K = 1M записей. Однако, поскольку мастер возвращает только 50K (из 1M), может быть достаточно, чтобы узлы отправляли только топ 10K записей. С подзапросом запрос можно переписать так:

     SELECT * FROM
          (SELECT * FROM my_dist_index WHERE some_conditions LIMIT 10000)
      ORDER by some_attr LIMIT 50000;

    В этом случае узлы получают только внутренний запрос и выполняют его. Это означает, что мастер получит только 20x10K=200K записей. Мастер возьмёт все полученные записи, переупорядочит их по ВНЕШНЕМУ условию и вернёт лучшие 50K записей. Подзапрос помогает уменьшить трафик между мастером и узлами, а также сократить время обработки мастера (так как он обрабатывает только 200K вместо 1M записей).

Last modified: August 28, 2025