Любой механизм должен быть достаточно умным, чтобы оптимизировать запрос, основываясь на том факте, что в таблице b всего десять строк. То, как движок определяет, что делать, зависит от таких факторов, как индексы и статистика.
Если столбец «ключ» является первичным ключом и / или проиндексирован, движку потребуется выполнить очень мало работы для выполнения этого запроса. По сути, он уже «знает», где находятся совпадающие строки, и очень быстро их ищет. Это не должно будет "повторяться" вообще.
Если в ключевом столбце нет индекса, движок должен будет выполнить «сканирование таблицы» (примерно эквивалент «итерации»), чтобы найти правильные значения и сопоставить их. Это означает, что ему придется сканировать 10 миллионов строк.
Прочитайте немного о том, что называется планом выполнения. Это в основном объяснение того, какую работу должен был выполнить движок для выполнения вашего запроса (некоторые базы данных отображают его только в текстовом виде, некоторые имеют возможность увидеть его графически). Изучение интерпретации плана выполнения позволит вам лучше понять, как добавить индексы в ваши таблицы и оптимизировать ваши запросы.
Посмотрите их, если они не работают (это было давно), но это что-то вроде:
- В MySQL поместите работу "EXPLAIN" перед оператором SELECT
- В Oracle запустите «SET AUTOTRACE ON» перед выполнением оператора SELECT
Я думаю, что первый (Oracle) запрос лучше написать с помощью JOIN, а не WHERE EXISTS. Двигатель может быть достаточно умным, чтобы оптимизировать его в любом случае. Как только вы освоите интерпретацию плана выполнения, вы можете запустить его в обоих направлениях и убедиться в этом сами. :)