Spec-Zone.ru › MariaDB

Стратегия LooseScan

LooseScan — это стратегия выполнения для подзапросов полусоединения.

Идея

Мы продемонстрируем стратегию LooseScan на примере. Предположим, мы ищем страны, имеющие спутники. Мы можем получить их с помощью следующего запроса (для простоты мы игнорируем спутники, принадлежащие консорциумам нескольких стран):

select * from Country  
where 
  Country.code in (select country_code from Satellite)

Предположим, существует индекс на Satellite.country_code. Если мы используем этот индекс, мы получим спутники в порядке их страны-владельца:

loosescan-satellites-ordered-r2

Стратегия LooseScan фактически не нуждается в упорядочивании, ей необходимо группирование. На приведенном рисунке спутники сгруппированы по стране. Например, все спутники, принадлежащие Австралии, собираются вместе, не смешиваясь со спутниками других стран. Это упрощает выбор только одного спутника из каждой группы, который можно объединить со страной и получить список стран без дубликатов:

loosescan-diagram-no-where

LooseScan в действии

Результат EXPLAIN для вышеуказанного запроса выглядит следующим образом:

MariaDB [world]> explain select * from Country where Country.code in 
  (select country_code from Satellite);
+----+-------------+-----------+--------+---------------+--------------+---------+------------------------------+------+-------------------------------------+
| id | select_type | table     | type   | possible_keys | key          | key_len | ref                          | rows | Extra                               |
+----+-------------+-----------+--------+---------------+--------------+---------+------------------------------+------+-------------------------------------+
|  1 | PRIMARY     | Satellite | index  | country_code  | country_code | 9       | NULL                         |  932 | Using where; Using index; LooseScan |
|  1 | PRIMARY     | Country   | eq_ref | PRIMARY       | PRIMARY      | 3       | world.Satellite.country_code |    1 | Using index condition               |
+----+-------------+-----------+--------+---------------+--------------+---------+------------------------------+------+-------------------------------------+

Характеристики

  • LooseScan избегает создания дублируемых комбинаций записей, помещая таблицу подзапроса первой и используя её индекс для выбора одной записи из нескольких дубликатов
  • Следовательно, для применения LooseScan подзапрос должен выглядеть следующим образом:
expr IN (SELECT tbl.keypart1 FROM tbl ...)

или

expr IN (SELECT tbl.keypart2 FROM tbl WHERE tbl.keypart1=const AND ...)
  • LooseScan может обрабатывать коррелированные подзапросы
  • LooseScan можно отключить, установив флаг loosescan=off в переменной optimizer_switch.
Содержимое, воспроизводимое на этом сайте, является собственностью соответствующих владельцев, и это содержание не предварительно проверяется MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают позицию MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/loosescan-strategy/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API