Вопрос по теории SQL-запросов - PullRequest
5 голосов
/ 21 мая 2010

У меня есть большая таблица исторических транзакций (15-20 миллионов строк, МНОГИЕ столбцы) и таблица с одна строка, один столбец . Таблица с одной строкой содержит дату (дату последней обработки), которая будет использоваться для извлечения данных из таблицы транзакций ('process_date').

Вопрос: Должен ли я внутренне присоединить таблицу «process_date» к таблице транзакций или таблицу транзакций к таблице «process_date»?

Ответы [ 5 ]

6 голосов
/ 21 мая 2010

Вот как бы я это сделал

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)
2 голосов
/ 21 мая 2010

При объединении таблиц оптимизатор запросов быстро анализирует их, чтобы определить наиболее подходящую реализацию объединения. Логически внутреннее соединение симметрично, но реализация может отдавать предпочтение одной стороне над другой для повышения производительности.

2 голосов
/ 21 мая 2010

Для удобства чтения я бы использовал внутреннее соединение из таблицы транзакций, чтобы явно указать, что вторая таблица с датой просто действует как фильтр.

2 голосов
/ 21 мая 2010

Внутреннее соединение - это симметричные, двунаправленные отношения, в общем случае это не имеет значения, но в этом случае я бы предложил вообще не объединяться, считывать пороговую дату в переменную и передавать ее в другой запрос select. как параметр ...

0 голосов
/ 21 мая 2010

Будет сделано перекрестное соединение:

SELECT t.col1, t.col2, p.process_date
FROM Transactions t, Process p;
...