Вопрос по теории SQL-запросов
У меня есть большая таблица исторических транзакций (15-20 миллионов строк, МНОГИЕ столбцы) и таблица с одной строкой на один столбец. Таблица с одной строкой содержит дату (дату последней обработки), которая будет использоваться для извлечения данных из таблицы транзакций ('process_date').
Вопрос: Должен ли я внутренне соединить таблицу 'process_date' с таблицей транзакций или таблицу транзакций с таблицей 'process_date'?
5 ответов
Вот как бы я это сделал
SELECT <<list only columns you need>>
FROM large_historical_transaction_table t
WHERE EXISTS (SELECT 1 FROM OneRowTable o
WHERE o.last_processing_date = t.process_date)
Внутреннее соединение - это симметричные, двунаправленные отношения, в общем случае это не имеет значения, но в этом случае я бы предложил вообще не объединяться, считывать пороговую дату в переменную и передавать ее в другой запрос select в качестве параметра....
Для удобства чтения я бы использовал внутреннее соединение из таблицы транзакций, чтобы явно указать, что вторая таблица с датой просто действует как фильтр.
При объединении таблиц оптимизатор запросов быстро анализирует их, чтобы определить наиболее подходящую реализацию объединения. Логически внутреннее объединение симметрично, но реализация может отдавать предпочтение одной стороне над другой для повышения производительности.
Перекрестное соединение сделает это:
SELECT t.col1, t.col2, p.process_date
FROM Transactions t, Process p;