Ответ 1
Итак, почему мой ответ неверен?
Вы отвечаете правильно.
Мое предположение, почему учитель отметил это как ошибочное, что он пытался практиковать использование объединений с этим вопросом. Но это должно было быть частью вопроса, если бы это было предназначено.
В чем разница между этими запросами
Технически они действительно разные. СУБД с простым оптимизатором запросов будет извлекать подзапрос другим способом, чем соединение с ответом вашего учителя.
Я бы не удивился, если бы СУБД с хорошим оптимизатором действительно мог придумать один и тот же план выполнения для обоих запросов.
Изменить
Я создал несколько тестовых данных с 50000 книгами, 50000 авторов и 7 разных жанров для тестирования (меньшие числа на самом деле не имеют смысла, поскольку оптимизаторы обычно просто захватывают всю таблицу). Операция вернет 7144 строк.
PostgreSQL
Планы выполнения почти идентичны с небольшим изменением метода "join".
Вот план для подвыборной версии: http://explain.depesz.com/s/eov
Вот план для версии присоединения: http://explain.depesz.com/s/aTI
Удивительно, что версия соединения имеет несколько более высокую стоимость.
Oracle
Оба плана на 100% идентичны:
-------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 6815 | 399K| | 273 (2)| 00:00:04 | | 1 | HASH UNIQUE | | 6815 | 399K| 464K| 273 (2)| 00:00:04 | |* 2 | HASH JOIN | | 6815 | 399K| | 172 (2)| 00:00:03 | |* 3 | TABLE ACCESS FULL| BOOK | 6815 | 166K| | 69 (2)| 00:00:01 | | 4 | TABLE ACCESS FULL| AUTHOR | 50000 | 1708K| | 103 (1)| 00:00:02 | --------------------------------------------------------------------------------------
Посмотрев статистику при использовании autotrace
, также нет никакой разницы. Я не потрудился создать файл трассировки для его анализа, поскольку я не ожидаю увидеть там разницу.
Вещи не меняются, если добавлен индекс в book.genre
. Oracle придерживается полного сканирования таблицы (даже с 100000 строк). Вероятно, потому, что таблицы не очень широкие, и много строк подходят на одной странице.
PostgreSQL использует индекс для обоих операторов, но до сих пор нет реальной разницы между планами.