Форум: "Прочее";
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];
ВнизДва простых вопроса по 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.004 c