|
Пихать ли в 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?fid=40&msg=39557897&tid=1561326]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 167ms |
0 / 0 |