В зависимости от наличия статистики и индексов для рассматриваемых таблиц механизм перезаписи запросов в оптимизаторе может или не может сканировать Table2
для записей, где val < 100
перед сканированием Table1
.
В определенных ситуациях, исходя из демографических данных, объединений, индексации и статистики, вы можете обнаружить, что оптимизатор не удаляет записи в плане запросов, когда вы считаете, что это необходимо.Даже если у вас есть производная таблица, такая как в вашем примере.Вы можете заставить оптимизатор обрабатывать производную таблицу, просто поместив GROUP BY в свою производную таблицу.Затем оптимизатор обязан разрешить агрегат GROUP BY, прежде чем он сможет рассмотреть вопрос разрешения соединения между двумя таблицами в вашем примере.
SELECT table1.id, table3.val
FROM table1
INNER JOIN (
SELECT table2.id, tabl2.val
FROM table2
WHERE val<100
GROUP BY 1,2
) table3
ON table1.id=table3.id
Это не означает, что ваш стандартный подход должен работать с этимчерез ваш код.Обычно это один из моих последних курортов, когда у меня есть план запроса, который просто не удаляет посторонние записи достаточно рано в плане и приводит к тому, что слишком много данных сканируется и переносится через различные файлы SPOOL.Это просто методика, которую вы можете использовать в своем наборе инструментов, когда сталкиваетесь с такой ситуацией.
Механизм переписывания запросов постоянно обновляется от одного выпуска к другому, и подробности о том, как он работает, можно найти в Руководство по обработке транзакций SQL для Teradata 13.0.