Когда вы отправляете в базу SELECT ... WHERE ... JOIN ..., вы не говорите ей, как именно выполнять запрос — вы говорите, что вам нужно получить. Как именно это получить, решает отдельный компонент — планировщик запросов (query planner, или оптимизатор). Он перебирает несколько способов добраться до тех же данных, оценивает каждый по стоимости и выбирает тот, что кажется дешевле всего. Проблема в том, что «кажется» здесь ключевое слово: планировщик не знает данные точно, он о них догадывается — и иногда догадывается неправильно.
Подробнее →