Гордон имеет хороший ответ.Дело в том, что производительность зависит от множества различных факторов, включая структуру / схему базы данных и объем данных.
В качестве приблизительного ориентира, подзапрос exists
будет выполняться один раз для каждой строки в replays
, а подзапрос in
будет выполняться один раз, чтобы получить результаты подзапроса.-query, и затем эти результаты будут искать для каждой строки в replays
.
Таким образом, с exists
, чем лучше путь индексации / доступа, тем быстрее он будет работать.Без соответствующих индексов он будет просто читать все строки, пока не найдет совпадение.Для каждой строки в replays
.Для строк без совпадений это будет заканчиваться чтением таблицы players
каждый раз.Даже строки с совпадениями могут прочитать значительное число players
перед тем, как найти совпадение.
С in
чем меньше набор результатов из подзапроса, тем быстрее он будет выполняться.Для тех, у кого нет совпадений, достаточно быстро проверить небольшие строки подзапроса, чтобы получить ответ.Тем не менее, вы не получаете преимущества от индексов (если это работает таким образом), поэтому для большого результирующего набора из подзапроса необходимо прочитать каждую строку в подвыборке, прежде чем решить, что при отсутствии совпадения.
Тем не менее, оптимизаторы баз данных довольно умны и не всегда оценивают запросы точно так, как вы их запрашиваете, поэтому для проверки наилучшего подхода важно проверить планы выполнения и самостоятельно протестировать себя.Нет ничего необычного в том, что можно ожидать, что определенный путь выполнения только обнаружит, что оптимизатор выбрал другой метод выполнения в зависимости от того, как он ожидает, что данные будут выглядеть.