SQL-соединения против подзапроса - разница в производительности - PullRequest
2 голосов
/ 15 марта 2019

Что быстрее в исполнении - написание объединения или выполнение подзапроса?Как и

select * 
from table A 
where A.fieldAValue =(select fieldAValue from table B where fieldXValue =101) ; 

Я считаю, что решение выбрать правильный sql зависит от того, как данные структурированы / определены в таблицах.Я прав или нет?

Ответы [ 2 ]

8 голосов
/ 16 марта 2019

Там действительно нет способа ответить на этот вопрос.Вы думаете об этом неправильно.SQL-запрос не является инструкцией к базе данных о , как получить желаемый набор результатов, вместо этого это описание нужных вам данных.Как получить это до базы данных.

Oracle перепишет ваш запрос в план выполнения.Он будет искать наиболее эффективный план, основываясь на ваших таблицах, индексах, ограничениях, статистике, которую он собирает, и даже догадывается, что он делает, основываясь на данных.На самом деле, вполне возможно, что вы можете написать этот запрос с объединением и подзапросом, и это приведет к точно такому же плану выполнения и той же производительности.

Я предлагаю написать запрос так, чтобы его было легкочтобы понять, что происходит.Только если производительность действительно плохая, вы должны беспокоиться о том, что она делает.Oracle довольно умен и может найти путь к вашим данным, который окажется лучше, чем вы думали.

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

Скалярные подзапросы, как правило, очень удобны в использовании.Они кэшируются, поэтому запрос, вероятно, будет выполнен только один раз, даже если в вашем наборе результатов будет миллион строк.Я бы порекомендовал эту статью (наряду со всем остальным, что когда-либо писал Том Кайт): О кэшировании и евангелизации SQL

1 голос
/ 15 марта 2019

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

...