Устранение таблиц в MariaDB
Первым делом оптимизатор MariaDB объединяет определение VIEW в запрос, получив:
select ACRAT_rating
from
ac_anchor
left join ac_name on ac_anchor.AC_ID=ac_name.AC_ID
left join ac_dob on ac_anchor.AC_ID=ac_dob.AC_ID
left join ac_rating on (ac_anchor.AC_ID=ac_rating.AC_ID and
ac_rating.ACRAT_fromdate =
(select max(sub.ACRAT_fromdate)
from ac_rating sub where sub.AC_ID = ac_rating.AC_ID))
where
ACNAM_name='Gary Oldman'
Важно понимать, что полученный запрос содержит бесполезную часть:
-
left join ac_dob on ac_dob.AC_ID=...произведёт ровно одну соответствующую запись:-
primary key(ac_dob.AC_ID)гарантирует, что для любого значенияac_anchor.AC_IDбудет не более одной совпадения, - и если соответствия не будет,
LEFT JOINсгенерирует строку с NULL
-
- и нам неважно, какая это запись, так как таблица
ac_dobне используется больше нигде в запросе.
Это означает, что часть left join ac_dob on ... можно удалить из запроса, и именно это делает модуль Устранения таблиц. Логика обнаружения довольно умная, например, она сможет удалить и часть left join ac_rating on ... вместе с подзапросом (в данном примере она не удалится, потому что ac_rating используется в списке выбора запроса). Модуль Устранения таблиц также может обрабатывать вложенные внешние соединения и внешние соединения нескольких таблиц.
См. также
- Эта страница основана на следующей записи блога об устранении таблиц: http://s.petrunia.net/blog/?p=58
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/table-elimination-in-mariadb/