|
Тема |
Re: за какво? [re: Topбaлaн] |
|
Автор |
salle (минаващ) |
|
Публикувано | 25.02.03 13:26 |
|
|
Това което твърдя, е че ако една заявка може да бъде написанана по два начина със и без вложени SELECT то първия начин в общия случай (почти винаги) ще е по-бърз.
Пример
select t1.id from t1 where id in (select id from t2);
select t1.id from t1, t2 where t1.id = t2.id;
Двете заявки връщат идентичен резултат. Само, че при първата Сървъра трябва да направи следното:
select id from t2;
т.е. да избере стойностите на id за всички редове от таблилца t2
да ги запомни в някаква временна таблица и след това да сравнява стойностите от t1 с тези от временната таблица.
Колкото и да е хитър оптимизатора просто в този случай има да свърши повече работа отколкото при Join-а във втората заявка където може да претърси за съвпадащи стойности във Индексите на двете таблици (предполагайки, че ID са индексирани и в двете)
Да не говорим за вложени заявки, които се обръщат към "обвиващата" заявка - там много лесно можеш да накараш сървръа за таблици
t1 -> 1M реда
t2 -> 10 000 реда
да изпълни по 1 заявка върху t2 за всеки ред от t1 - т.е. 1 милион + 1 заявки върху талбица t2
вместо JOIN, който "закача" t2 само веднъж.
Изобщо не случайно в доста книги за SQL съветват да се избягват всякакви вложени заявки освен когато няма друг начин да се реши проблема.
Тъй, че това е моето твърдение - за идентичен резултат решението с вложени заявки е по-бавно на всеки сървър. Понякога драстично по-бавно.
Демонстрирай ми поне един пример къдетопри дДОБРЕ ОБМИСЛЕНИ ИНДЕКСИ и ДОБРЕ ОПТИМИЗИРАН SQL с вложени заявки работи по-бързо от ДОБРЕ ОПТИМИЗИРАН SQL без вложени заявки като и двата връщат идентичен резултат.
Подчертавам оптимизацията защото винаги можеш да направиш контрапример от рода на "да ама когато в таблиците няма никакви индекси ...."
|
| |
|
|
|