|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Добрый день. Есть две таблички, связанные как M-D: City / город и Street / Улица Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Нужно показать улицы, длина которых больше 100 метров. Вопрос: 1. Как идеологически более верно: Код: sql 1. 2. 3. 4.
или Код: sql 1. 2. 3. 4.
? 2. И почему. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:22 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
22.11.2017 13:22, Скоро пятница пишет: > И почему. никогда не смотри планы и статистику выполнения запросов. сохраняй интригу. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:26 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Мимопроходящий22.11.2017 13:22, Скоро пятница пишет: > И почему. никогда не смотри планы и статистику выполнения запросов. сохраняй интригу. Одинаковые. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:30 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
ИМХО, второй вариант идеологически неверен тем что условие отбора засунуто в условие джойна. Лучше не смешивать эти понятия в одну кучу без особой нужды. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:31 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Скоро пятница> 2. E ii?aio. Никаких жестких общих правил нет. Общая рекомендация - в join писать то, что соединяет соотв. таблицы, а всё остальное - фильтры - в where. Это когда join inner, конечно, с left всё работает иначе. А планы, если будут отличаться, - можно и нужно "настраивать". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:33 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
fraksИМХО, второй вариант идеологически неверен тем что условие отбора засунуто в условие джойна. Лучше не смешивать эти понятия в одну кучу без особой нужды.Скоро пятница... 2. И почему. ... Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:34 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Скоро пятница, ответ - нет. идеологически более верно в on писать именно условие объединения, а в where - условия фильтрации получаемого результата. см. http://www.ibase.ru/joins/ раздел "Отличие между On и Where" и дальше в разделе "Left/Right Join" в качестве дополнительного примера можно привести запрос Код: sql 1. 2. 3.
мы не можем включить where o.id is null в on, потому что это не является условием объединения, и вообще записей с o.c_id is null в таблице orders не существует. Но эти записи возникают в результате работы left join. В разделе "Left/right join" есть обратный пример, когда ошибочный вынос условия ON в where меняет результат запроса. В общем, on и where - это не одно и то же. Если для inner join результат не отличается, то для left/right join - разница есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:36 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам... Общая рекомендация - в join писать то, что соединяет соотв. таблицы, а всё остальное - фильтры - в where. ... Что за рекомендация, чья(откуда)? Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:37 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Скоро пятница> Что за рекомендация, чья(откуда)? А, трололо... Вовка, ты что ли опять проказничаешь? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:38 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
kdv, да, именно с inner. Исключительно для inner случая вопрос был. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:38 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Скоро пятницаЧто за рекомендация, чья(откуда)? вопрос странный. рекомендация обусловлена синтаксисом. Если вы пытаетесь схитрить, то обманете сами себя - например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат. Ну или тот, кто будет читать ваши запросы, будет долго думать, какого хрена в on написано то, что должно быть в where. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:40 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
kdvСкоро пятницаЧто за рекомендация, чья(откуда)? вопрос странный. рекомендация обусловлена синтаксисом. Если вы пытаетесь схитрить, то обманете сами себя - например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат. Ну или тот, кто будет читать ваши запросы, будет долго думать, какого хрена в on написано то, что должно быть в where. Понятно. Первая причина: если впоследствии придется изменить inner на другой - фигня может получиться, которую сразу и не заметишь. Вторая: так не делают. Большое спасибо, ваш ответ меня полностью устроил. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:42 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
не майся сомненьями. пиши без джойна. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 14:06 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Хороший лозунг. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 15:01 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
kdvЕсли вы пытаетесь схитрить, то обманете сами себя - например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат.А о каком случае "напоретесь" (кроме null / not null, которые пишутся изначально только под outer join) ты говоришь? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 15:05 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
WildSery> А о каком случае "напоретесь" (кроме null / not null Зависит от того, откуда куда переносить и от того, на что и как фильтр накладывается. Если из left-джойна в where, то выборка может сильно сократиться. Если наоборот, то выборка может наоборот увеличиться, с теми самыми null-ами (а таблиц-то больше дувх в запросе может быть). Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 15:21 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
WildSeryА о каком случае "напоретесь" у меня в статье этот случай прописан. пример - дата по заказам в on и where. Но это опять же по правой части left join. Для меня, собственно, этот вопрос не существует. ON это условие объединения двух таблиц. То есть столбец из таблицы А и столбец из таблицы Б. WHERE - это условие фильтрации по столбцам одной из таблиц. Да, в ON можно добавить условие по одному из столбцов чтобы ОГРАНИЧИТЬ записи, по которым делается join, в дополнение к объединению по "столбец из А и столбец из Б". То есть, у меня в голове множества до join и после не являются одним и тем же, даже если бы результат их объединения и фильтрации был одинаковым. :-) A join B on a.id = b.a_id and a.id > 10 это последовательно: - ограничение множества A -> множество А штрих. - объединение множества А штрих и множества Б Сейчас это заменяется на (select from A where a.id > 10) join B on a.id = b.a_id здесь A join B on a.id = b.a_id where a.id > 10 последовательно - объединение множеств А и Б - результат = множество С - применение фильтра над множеством С и мне пофиг, как оно оптимизатором выполняется. Результат должен быть такой, как у указанных операций над множествами в соответствии с последовательностью операции. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 15:54 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
kdv> A join B on a.id = b.a_id and a.id > 10 Это какой-то маразматический пример. Обычно в ON если и пихают доп.фильтры, то на detail-таблицу, а не мастер-таблицу. > A join B on a.id = b.a_id > where a.id > 10 > > последовательно > - объединение множеств А и Б - результат = множество С > - применение фильтра над множеством С > > и мне пофиг, как оно оптимизатором выполняется. +1 Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 16:19 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
На всякий случай, ещё раз процитирую тебя: kdvпривыкнете для inner join втыкать where в условие on , а потом напоретесь Так на что же я могу напороться? ЗЫ. Я нередко условия для присоединяемой таблицы пишу в ON, поскольку в многоэтажном WHERE часто разобраться значительно сложнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 16:37 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
WildSery> На всякий случай, ещё раз процитирую тебя: Ты как-то избирательно цитируешь, тогда уж полностью цитируй: например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 16:41 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, Полностью я процитировал до этого, но Дмитрий вопрос не понял. И ты, похоже, тоже не вникал. Спрашиваю ещё раз. В каком случае, кроме одного-единственного, для поиска (не)найденных строк, я могу на что-то "напороться", если условия пишу в ON? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 18:36 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
WildSery> кроме одного-единственного, для поиска (не)найденных строк Не понял. Если фильтр на левую таблицу перенести в ON - это один случай. Если фильтр на правую таблицу перенести в ON - это второй случай. Разумеется, если множеств (таблиц) больше двух, то и вариантов их пересечений и результатов становится больше. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 19:11 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
В современных условиях наверное действительно лучше стремиться к канонической форме хотя бы для читабельности, но в 1-1.5 оптимизатор порой более уверенно обращался с индексами когда условие было в ON. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 19:56 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамРазумеется, если множеств (таблиц) больше двух, то и вариантов их пересечений и результатов становится больше. не-а. джойны все равно попарно выполняются (обрабатываются). в inner пары могут образовываться в зависимости от кардинальности (типа A + (B+C) или (A+B) +C и т.д.), а в left/right они образуются жестко в порядке следования. Ну и еще, a right join b преобразуется оптимизатором в b left join a. Так что, вариантов пересечения там больше не образуется, т.к. их последовательность по большей части фиксированная. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 19:56 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
kdv> Так что, вариантов пересечения там больше не образуется, kdv> т.к. их последовательность по большей части фиксированная. Ну ты мне ещё про транзитивность расскажи. :) Больше - потому что изменения результата предыдущего соединения может повлиять на следующее, хотя казалось бы его не трогает. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 20:10 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Старый плюшевый мишкаВ современных условиях наверное действительно лучше стремиться к канонической форме хотя бы для читабельности даже если "каноническая" форма приводит к взбрыкиванию оптимизатора, любые подобные отклонения надо рассматривать именно как отклонения. И если уж и использовать, то с обязательной пометкой такого запроса как "криво оптимизируемого". Или вообще его переписать так, чтобы вопросов к оптимизатору не было (если возможно). Приведу пример. Известно, что при plan sort строится временный файл, который состоит из фиксированных записей макс. длины равной ключ (order by) плюс содержимое select <column_list>. Если в этом <column_list> какой-нибудь varchar(10000), ясное дело, файл сортировки получится конского размера. Например Код: sql 1. 2. 3.
в этом запросе вот этот здоровенный столбец - Table1.REF_REMPLACEMENT. Еманов (или кто еще) придумал такой трюк. Берем, получаем отсортированный набор идентификаторов, а потом по нему выбираем этот столбец, джойном. Код: sql 1. 2. 3. 4. 5. 6.
Все вроде прекрасно - сначала сортируется внутренний подзапрос, а потом к нему приклеивается джойном внешняя часть. И это работает. Однако. Когда я стал проверять это же самое в InterBase 2017, обнаружилось, что в ИБ результат нихрена не сортированный, и его приходится сортировать еще раз. Так вот, выяснилось, что оптимизатор ФБ берет вот этот сорт-файл за базу, и к нему пристегивает джойн, а оптимизатор ИБ делает это НЕ ТАК. И в этот момент я понял, что оптимизатор ФБ как раз-то и не прав. В том смысле неправ, что нельзя ориентироваться на результат сортировки внутреннего подзапроса. И если хочешь отсортировать РЕЗУЛЬТАТ, то order by должно быть в конце всего, а не где-то в середине. А это (order by в конце) убивает весь этот придуманный трюк. Ну это как Еманов регулярно говорит - "не надейтесь на group by, что он вам правильно отсортирует. В будущих версиях group by может использовать другой метод доступа, который будет выдавать записи в другом порядке". И теперь вдруг тот же Еманов говорит - "используйте вот такой трюк, оно вам отсортирует". Собственно, я тут Еманова никак не обвиняю, я просто говорю, что не надо реляционную алгебру подстраивать под особенности оптимизатора. Думать надо именно реляционной алгеброй. Разумеется, с учетом специфики нашего оптимизатора. Но именно реляционная алгебра даст правильное понимание join, on, where и прочего. А оптимизатор меняется с каждым релизом. И если начать думать "за оптимизатор", а не реляционной алгеброй, то у вас через 3-4 версии просто поедет крыша :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 20:14 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
мопед был не мой (с) :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 20:42 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
kdv, GROUP BY может выполняться с помощью другого алгоритма HASH GROUP или как так. Так что действительно на это не следует закладываться. kdvЕманов (или кто еще) придумал такой трюк. Это работает только потому что оптимизатор derived table всегда ставит первым потоком в join. Однако в будущем это может поменяться. Можно подстраховать себя и использовать LEFT JOIN тогда порядок соединения будет гарантирован. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 21:12 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
kdvдаже если "каноническая" форма приводит к взбрыкиванию оптимизатора, любые подобные отклонения надо рассматривать именно как отклонения Панимаш какое дело. Как мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 21:16 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Старый плюшевый мишкаКак мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем.Ну, дык, логично, ответить, что не надо объяснять профильному специалисту, как правильно работать его работу. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 21:25 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Basil A. SidorovСтарый плюшевый мишкаКак мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем.Ну, дык, логично, ответить, что не надо объяснять профильному специалисту, как правильно работать его работу. Я не про это. Пальцы крутить умею когда надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 21:42 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Старый плюшевый мишка> Пальцы крутить умею Кому? P.S. Больно? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 21:59 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамСтарый плюшевый мишка> Пальцы крутить умею Кому? P.S. Больно? Отца Кабани спроси :) Умнейшая штука – мясокрутка называемая. Зачем? Нежный мясной фарш... Молодец!.. И мясокрутку мою забрал. Молодец, грит! Голова, грит, у тебя!.. И теперь, значит, в Веселой Башне нежный фарш делает... Очень, говорят, способствует... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 22:40 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Старый плюшевый мишкаКак мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем. не, так не пойдет. :-) Если вернуться к исходному вопросу этого топика, то речь не о красивой программе, а о том, каким должен быть мыслительный процесс для решения задачи. А если правильного процесса нет (раз нет понимания кубиков, из которых решение складывается), то и решения нет, или оно неправильное. А красивое и правильное - это не одно и то же. p.s. меня регулярно пробивает на "помню, что тут было вот так, поэтому...". Но чтобы "оптимизатор при помещении в on условия where как-то иначе оптимизировал" - если такое даже и было (а я такого не помню), то оно уехало далеко и надолго. Интересующиеся, кстати, на мои примеры должны были сразу тут привести куски explain plan в ФБ 3. Видимо, никого не торкнуло. Ну хоть кто на семинаре последнем был в Москве, вы-то попробуйте. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 00:04 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
kdvСтарый плюшевый мишкаКак мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем. p.s. меня регулярно пробивает на "помню, что тут было вот так, поэтому...". Но чтобы "оптимизатор при помещении в on условия where как-то иначе оптимизировал" - если такое даже и было (а я такого не помню), то оно уехало далеко и надолго. Ну и слава Аллаху. Я же этта... динозавер. Вообще-то мне это некогда ДЕ подсказал, я попробовал и понравилось :) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 00:20 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
kdvречь ... о том, каким должен быть мыслительный процесс для решения задачи. А если правильного процесса нет (раз нет понимания кубиков, из которых решение складывается), то и решения нет, или оно неправильное. А красивое и правильное - это не одно и то же. Это тебя сильно торкнуло. Тоже садись мемуары в легком эпистолярном жанре писать. Только не очередное "Трое в серверной". Я даже почитаю. :) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 00:21 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
СПМ> Вообще-то мне это некогда ДЕ подсказал, я попробовал и понравилось :) Это некошерно. Трюки с плюсиками кошернее. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 00:24 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, трюки с плюсиком не помогут для уменьшения ширины резалсета под сортировку ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 09:21 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1561326]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
212ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 350ms |
total: | 662ms |
0 / 0 |