Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1314889116
Gu
2011-09-01 18:58
2011.12.18
строковые константы


15-1314592325
Дмитрий С
2011-08-29 08:32
2011.12.18
Целочисленное деление mysql и...


2-1315402765
OW
2011-09-07 17:39
2011.12.18
Ошибка экспорта в Excel: OLE error 800A03EC; EOleException


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


2-1315226772
rammic
2011-09-05 16:46
2011.12.18
Получение данных из 3ds Max





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский