Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.18;
Скачать: CL | DM;

Вниз

Два простых вопроса по Oracle и PL/SQL Developer   Найти похожие ветки 

 
OW ©   (2011-08-24 10:54) [0]

Напомните, как лучше ?
Большую таблицу соединять с поменьше, потом еще с меньше, потом еще с меньше и т.п., или наоборот?
Имхо, наоборот. С маленькой.

Как вызвать аналог завершения кода delphi?
Ну, т.е. когда точку поставил, тебе предлагает варианты, ты набираешь, ошибся, вариантов нет - пропадает. Стираешь последний символ, а подсказки уже нет. В Delphi стер, Ctrl+Space (родная комбинация или от CnPack - не знаю) и снова показывает варианты.


 
Игорь Шевченко ©   (2011-08-24 13:44) [1]


> Большую таблицу соединять с поменьше, потом еще с меньше,
>  потом еще с меньше и т.п., или наоборот?
> Имхо, наоборот. С маленькой.


Оптимизатор сам знает, как ему соединять


> Как вызвать аналог завершения кода delphi?


любую букву ввести - появляется


 
asail ©   (2011-08-24 13:51) [2]


> Игорь Шевченко ©   (24.08.11 13:44) [1]

> Оптимизатор сам знает, как ему соединять

Если, конечно, речь не идет о LEFT или RIGHT OUTER JOIN. Иначе, зависит уже от бизнес-логики как соединять.


 
Игорь Шевченко ©   (2011-08-24 14:22) [3]

asail ©   (24.08.11 13:51) [2]

Оптимизатор сам знает


 
asail ©   (2011-08-24 15:34) [4]


> Игорь Шевченко ©   (24.08.11 14:22) [3]

Вряд ли. Результат запроса может совсем разный получиться...


 
Игорь Шевченко ©   (2011-08-24 16:42) [5]


> Результат запроса может совсем разный получиться...


Результат запроса от порядка перечисления таблиц в запросе разным не будет. Это мы об Oracle ведем речь, если что, и опускаем применение разного рода подсказок оптимизатору. От типов соединений да, результат безусловно будет в общем случае разный :)


 
asail ©   (2011-08-24 17:08) [6]


> Игорь Шевченко ©   (24.08.11 16:42) [5]

Давай такой пример посмотрим:
Имеем 2 таблицы EMP_TBL (EmpId, DeptId) и DEPT_TBL (DeptId, DeptName), которые содержат следующие записи...
EMP_TBL
1   1
2   2

DEPT_TBL
1   "Department 1"
2   "Department 2"
3   "Department 3"

Сколько записей вернут запросы
select * from EMP_TBL LEFT JOIN DEPT_TBL on EMP_TBL.DeptID = DEPT_TBL.DeptIdи
select * from DEPT_TBL LEFT JOIN EMP_TBL on EMP_TBL.DeptID = DEPT_TBL.DeptId
?
PS. С ораклом не шибко знаком, но в данном случае, думаю, он не сильно от стандартного SQL отличается...


 
Sergey Masloff   (2011-08-24 17:22) [7]

asail ©   (24.08.11 17:08) [6]
Э, это у тебя два разных запроса ;-)

select e.*, d.DeptName
from EMP_TBL e, DEPT_TBL d
where e.deptid=d.deptid

вернет одинаково как не переставляй ;-)


 
asail ©   (2011-08-24 17:34) [8]


> Sergey Masloff   (24.08.11 17:22) [7]

Вот блин... Перечитай [2] - я там не зря про LEFT|RIGHT JOIN упомянул. А ты мне с INNER JOIN пример привел...

Где 2 разных запроса в [6]? Они одинаковые и отличаются только порядком указания таблиц...


 
Компромисс   (2011-08-24 17:49) [9]

- Как писать: a + b или b + a?
- Оптимизатор сам знает. Без разницы
- А если написать a / b?
- Оптимизатор сам знает
- Но ведь a/b <> b/a?
- Тогда это разные (неэквивалентные) выражения. А для эквивалентных выражений (с +) нет разницы, оптимизатор сам найдет наилучший способ вычисления.
- Но ведь не зря я про деление написал?


 
Компромисс   (2011-08-24 17:55) [10]

Кстати, эквивалентом
select * from EMP_TBL LEFT JOIN DEPT_TBL on EMP_TBL.DeptID = DEPT_TBL.DeptId
будет
select * from DEPT_TBL RIGHT JOIN EMP_TBL on EMP_TBL.DeptID = DEPT_TBL.DeptId
и Оптимизатор сам знает, как ему соединять (с)


 
Компромисс   (2011-08-24 17:57) [11]

Точнее
select EMP_TBL.*,DEPT_TBL.* from EMP_TBL LEFT JOIN DEPT_TBL on EMP_TBL.DeptID = DEPT_TBL.DeptId
и
select EMP_TBL.*,DEPT_TBL.* from DEPT_TBL RIGHT JOIN EMP_TBL on EMP_TBL.DeptID = DEPT_TBL.DeptId


 
Sergey Masloff   (2011-08-24 18:04) [12]


> Вот блин... Перечитай [2] - я там не зря про LEFT|RIGHT
> JOIN упомянул. А ты мне с INNER JOIN пример привел...
>
> Где 2 разных запроса в [6]? Они одинаковые и отличаются
> только порядком указания таблиц...

Ну как где? У тебя два разных. Ты явно говоришь возьми из этой и прилепи к ней из той.

Если хочешь вот пример с OUTER

select e.*, d.DeptName
from EMP_TBL e, DEPT_TBL d
where e.deptid=d.deptid(+)

тоже переставляй результат один будет ;-)

Кстати в твоем примере
select * from EMP_TBL LEFT JOIN DEPT_TBL on EMP_TBL.DeptID = DEPT_TBL.DeptId

конечно первой возьмется  EMP_TBL
а вот добавим
select * from EMP_TBL LEFT JOIN DEPT_TBL on EMP_TBL.DeptID = DEPT_TBL.DeptId
where DEPT_TBL.DeptName="ООО Газпром"

и уже фиг знает какая впереди будет в реальном плане


 
Sergey Masloff   (2011-08-24 18:10) [13]

[offtop] для программистов-автомобилистов смотрел тут на автофоруме одну фигню и в глаза бросается тема "геморойный exist или почему не стоит с ними связываться" уже мысленно составил пол-ответа типа "во-первых exist[s] во вторых наверное не геморой а руки с радиусом кривизны завышеным..." и только потом понял что о автомагазине небезызвестном речь ;-)
 Профзаболевание...


 
asail ©   (2011-08-24 18:26) [14]


> Компромисс   (24.08.11 17:49) [9]

У тебя не корректное сравнение уже в 1-м пункте... В сабже не указан конкретный тип связи таблиц. Так с чего там тогда конкретный "+" появился, а не "/" например? Соответственно, и все остальное уже не в тему.
Так что правильно было бы описать ветку так:
- Как писать: a Х b или b Х a (где Х некая связь между таблицами)?
- Оптимизатор сам знает. Без разницы
- Да, если речь не идет об a / b?
- Оптимизатор сам знает
- Но ведь a/b <> b/a?
...


 
asail ©   (2011-08-24 18:34) [15]


> Sergey Masloff   (24.08.11 18:04) [12]

> Ну как где? У тебя два разных. Ты явно говоришь возьми из
> этой и прилепи к ней из той.

Не более разных (с точки зрения синтаксиса), чем и у тебя в [7]...
И если оптимизатор вдруг решит переставить таблицы местами в моем запросе, то в топку его... Об чем я и говорил еще в [2] -  не во всех случаях можно указывать таблицы в произвольном порядке (от балды), при объединении таблиц (любом!). Т.е. в случае с запросом из [6], руководствоваться исключительно размерами таблиц нельзя.


> Если хочешь вот пример с OUTER

И что? Я тоже могу кучу примеров привести, где все пучком будет... Даже запросы из [6] вернут одно и тоже, если удалить последнюю строчку из второй таблицы...


 
Игорь Шевченко ©   (2011-08-24 20:25) [16]

asail ©   (24.08.11 18:34) [15]

Оптимизатор - он умный.

Похоже, что ты и твои оппоненты под изменением порядка таблиц подразумевают разные вещи. Отсюда и недопонимание :)


 
Компромисс   (2011-08-25 11:24) [17]

asail ©   (24.08.11 18:26) [14]

Любой SQL программист знает, что при LEFT/RIGHT JOIN левая таблица принципиально отличается от правой, поэтому вопроса "Как лучше" не может стоять в принципе. Все-таки, надо учитывать интеллектуальный уровень спрашивающего.

Хотя я понимаю, в чем проблема. Сам часто замечаю у себя профессиональную деформацию мышления, когда учитываю только то, что прописано/сказано в явном виде, полностью игнорируя контекст и ничего не додумывая. "Процессорное мышление", так сказать :-)


 
asail ©   (2011-08-25 18:21) [18]


> Игорь Шевченко ©   (24.08.11 20:25) [16]

> Компромисс   (25.08.11 11:24) [17]

Ну на том и порешим!


 
stakan ©   (2011-08-30 13:46) [19]

F6



Страницы: 1 вся ветка

Текущий архив: 2011.12.18;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.01 c
1-1277897030
Tangar83
2010-06-30 15:23
2011.12.18
Ошибка при использовании TWebBrowser


4-1232705413
WanderBuild
2009-01-23 13:10
2011.12.18
Как правильней получить список процессов?


2-1315213805
Servy
2011-09-05 13:10
2011.12.18
Отправка Soap Headers


8-1221403444
Nevalyashka
2008-09-14 18:44
2011.12.18
формат MusicXML


2-1315223947
vasiliy87
2011-09-05 15:59
2011.12.18
Вопрос о параметрах интефейсных функций