Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Что быстрее?  [new]
ananax
Member

Откуда: MO
Сообщений: 424
День добрый!
Подскажите, какой вариант предпочтительнее и быстрее будет отрабатываться?
Вар 1
select 
t1.*,
(select t2.data from t2 where t2.id=t1.id) data
from t1
Вар 2
select 
t1.*
t2.data
from t1,t2
where t1.id=t2.id (+)
29 ноя 06, 13:53    [3466856]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее?  [new]
Pir
Member

Откуда: Москва
Сообщений: 872
думаю что второй
29 ноя 06, 13:57    [3466888]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116174
ИМХО в данном случае большой разницы не будет,
вообще же мне милее скалярный подзапрос

Tom Kyte Effective Oracle by Design

When you remove an outer join , not only is the resultinq query usually easier
to read, but many times, the preformance can be imprived as well
29 ноя 06, 13:58    [3466898]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116174
сорри, "improved" естественно
29 ноя 06, 13:59    [3466904]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее?  [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1815
dmidek
сорри, "improved" естественно

Там под remove не переделка в скалярный подзапрос имеется ввиду, вообще то...

В общем случае все зависит от распределения данных, но чаще должен выигрывать вариант 2, если оптимизатор не ошибется в выборе метода соединения.

Вариант один будет хорош если по t1 будет фильтрующий предикат, t1.id не уникальный ключь, а некоторый набор повторяющихся значений (что порзволит получить преимущество от кеширования результатов скалярного подзапроса), т.е. t2 некий справочник ( лучше достаточно большой :) ). Но в любом случае надо тестировать на реальном наборе данных (или предпологаемом реальном).
29 ноя 06, 14:22    [3467081]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
dmidek
ИМХО в данном случае большой разницы не будет,
вообще же мне милее скалярный подзапрос
Будет разница.
Скалярный подзапрос - коррелированный подзапрос, выполняемый для каждой строки основного запроса.
OUTER JOIN Oracle может эффективно выполнить методом HASH JOIN.
Я считаю, что второй вариант в данном примере эффективнее.
29 ноя 06, 14:22    [3467084]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
у меня первый вариант активно применяется, когда расшифровка тянется из очень большой таблицы по удаленке (порядка 100 тыс строк) - там это действиетльно быстрее - что-то оптимизатор, зараза, недопонимает.... (9.2.0.7)
29 ноя 06, 14:48    [3467282]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить