2016-07-18 2 views
0

На работе я наткнулся на этот вид запроса:Cross Присоединяйтесь гораздо быстрее, чем внутреннее соединение

select distinct psv.pack_id from pack_store_variant psv, pack p 
where p.id = psv.pack_id and p.store_id = 1 and psv.store_variant_id = 196; 

Будучи новым для select from table1, table2 я сделал немного поиска и узнал, что это делает в основном декартово произведение двух столы. Я думал, что это необязательно создает строки NxM, мы можем просто использовать регулярное соединение, и оно должно работать. Так что я написал этот вопрос:

SELECT DISTINCT pack_id from (SELECT pack_id, store_id, store_variant_id 
FROM pack JOIN pack_store_variant ON pack.id = pack_store_variant.pack_id) as comb 
where comb.store_id = 1 AND comb.store_variant_id = 196; 

Удивительно, когда я сделал сравнение, первый был на порядок быстрее, чем мой. Мой вопрос как-то сосать? Или я не понимаю разницу между кросс-соединением/внутренним соединением должным образом?

ответ

1

Ваш запрос не очень хорош. Вы разделили запрос на два выбора. Внутренний создает таблицу, в которой вы затем выбираете ее снова. Это не очень эффективно. Вот как я это сделаю.

select distinct psv.pack_id from pack_store_variant as psv 
Join pack as p on p.id = psv.pack_id 
where p.store_id = 1 and psv.store_variant_id = 196; 
+0

Значит, в вашем запросе, где сделано вместе с объединением в одном цикле? – hoodakaushal

+0

@hoodakaushal Да. Производительность должна быть лучше, чем перекрестное соединение, но я не на это 100%. –

+0

Оказывается, это не так. Вы выполняете запрос быстрее, чем мой, но не последовательно быстрее, чем перекрестное соединение - оба находятся в пределах нескольких мс друг от друга, но не всегда быстрее. Я решил оставить его в покое. – hoodakaushal

Смежные вопросы