powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Пихать ли в join все, что можно?
14 сообщений из 39, страница 2 из 2
Пихать ли в join все, что можно?
    #39557851
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаВ современных условиях наверное действительно лучше стремиться к канонической форме хотя бы для читабельности
даже если "каноническая" форма приводит к взбрыкиванию оптимизатора, любые подобные отклонения надо рассматривать именно как отклонения. И если уж и использовать, то с обязательной пометкой такого запроса как "криво оптимизируемого".
Или вообще его переписать так, чтобы вопросов к оптимизатору не было (если возможно).
Приведу пример.

Известно, что при plan sort строится временный файл, который состоит из фиксированных записей макс. длины равной ключ (order by) плюс содержимое select <column_list>.
Если в этом <column_list> какой-нибудь varchar(10000), ясное дело, файл сортировки получится конского размера.

Например
Код: sql
1.
2.
3.
SELECT Table1.Champ1, Table1.REF_REMPLACEMENT, Table2.Champ2
FROM Table1 INNER JOIN Table2 ON Table1.Table2_ID = Table2.ID
ORDER BY Table1.Champ1



в этом запросе вот этот здоровенный столбец - Table1.REF_REMPLACEMENT.

Еманов (или кто еще) придумал такой трюк. Берем, получаем отсортированный набор идентификаторов, а потом по нему выбираем этот столбец, джойном.
Код: sql
1.
2.
3.
4.
5.
6.
WITH A (Champ1,Champ2,ID) AS
(SELECT Table1.Champ1, Table2.Champ2, Table1.ID
 FROM Table1 INNER JOIN Table2 ON Table1.Table2_ID = Table2.ID
 ORDER BY Table1.Champ1)
SELECT A.Champ1, Table1.REF_REMPLACEMENT, A.champ2
FROM A JOIN Table1 ON Table1.ID = A.ID



Все вроде прекрасно - сначала сортируется внутренний подзапрос, а потом к нему приклеивается джойном внешняя часть.
И это работает. Однако.
Когда я стал проверять это же самое в InterBase 2017, обнаружилось, что в ИБ результат нихрена не сортированный, и его приходится сортировать еще раз.
Так вот, выяснилось, что оптимизатор ФБ берет вот этот сорт-файл за базу, и к нему пристегивает джойн, а оптимизатор ИБ делает это НЕ ТАК.
И в этот момент я понял, что оптимизатор ФБ как раз-то и не прав. В том смысле неправ, что нельзя ориентироваться на результат сортировки внутреннего подзапроса. И если хочешь отсортировать РЕЗУЛЬТАТ, то order by должно быть в конце всего, а не где-то в середине.
А это (order by в конце) убивает весь этот придуманный трюк.

Ну это как Еманов регулярно говорит - "не надейтесь на group by, что он вам правильно отсортирует. В будущих версиях group by может использовать другой метод доступа, который будет выдавать записи в другом порядке". И теперь вдруг тот же Еманов говорит - "используйте вот такой трюк, оно вам отсортирует".
Собственно, я тут Еманова никак не обвиняю, я просто говорю, что не надо реляционную алгебру подстраивать под особенности оптимизатора. Думать надо именно реляционной алгеброй. Разумеется, с учетом специфики нашего оптимизатора. Но именно реляционная алгебра даст правильное понимание join, on, where и прочего. А оптимизатор меняется с каждым релизом. И если начать думать "за оптимизатор", а не реляционной алгеброй, то у вас через 3-4 версии просто поедет крыша :-)
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557858
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мопед был не мой (с) :-)
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557867
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

GROUP BY может выполняться с помощью другого алгоритма HASH GROUP или как так. Так что действительно на это не следует закладываться.

kdvЕманов (или кто еще) придумал такой трюк.

Это работает только потому что оптимизатор derived table всегда ставит первым потоком в join. Однако в будущем это может поменяться. Можно подстраховать себя и использовать LEFT JOIN тогда порядок соединения будет гарантирован.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557869
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvдаже если "каноническая" форма приводит к взбрыкиванию оптимизатора, любые подобные отклонения надо рассматривать именно как отклонения

Панимаш какое дело. Как мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557872
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаКак мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем.Ну, дык, логично, ответить, что не надо объяснять профильному специалисту, как правильно работать его работу.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557886
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovСтарый плюшевый мишкаКак мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем.Ну, дык, логично, ответить, что не надо объяснять профильному специалисту, как правильно работать его работу.

Я не про это. Пальцы крутить умею когда надо.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557897
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка> Пальцы крутить умею

Кому?

P.S. Больно?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557918
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамСтарый плюшевый мишка> Пальцы крутить умею

Кому?

P.S. Больно?


Отца Кабани спроси :)

Умнейшая штука – мясокрутка называемая. Зачем? Нежный мясной фарш... Молодец!.. И мясокрутку мою забрал. Молодец, грит! Голова, грит, у тебя!.. И теперь, значит, в Веселой Башне нежный фарш делает... Очень, говорят, способствует...
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557946
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаКак мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем.
не, так не пойдет. :-) Если вернуться к исходному вопросу этого топика, то речь не о красивой программе, а о том, каким должен быть мыслительный процесс для решения задачи. А если правильного процесса нет (раз нет понимания кубиков, из которых решение складывается), то и решения нет, или оно неправильное. А красивое и правильное - это не одно и то же.

p.s. меня регулярно пробивает на "помню, что тут было вот так, поэтому...". Но чтобы "оптимизатор при помещении в on условия where как-то иначе оптимизировал" - если такое даже и было (а я такого не помню), то оно уехало далеко и надолго.
Интересующиеся, кстати, на мои примеры должны были сразу тут привести куски explain plan в ФБ 3. Видимо, никого не торкнуло.
Ну хоть кто на семинаре последнем был в Москве, вы-то попробуйте.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557950
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvСтарый плюшевый мишкаКак мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем.
p.s. меня регулярно пробивает на "помню, что тут было вот так, поэтому...". Но чтобы "оптимизатор при помещении в on условия where как-то иначе оптимизировал" - если такое даже и было (а я такого не помню), то оно уехало далеко и надолго.

Ну и слава Аллаху. Я же этта... динозавер. Вообще-то мне это некогда ДЕ подсказал, я попробовал и понравилось :)
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557951
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvречь ... о том, каким должен быть мыслительный процесс для решения задачи. А если правильного процесса нет (раз нет понимания кубиков, из которых решение складывается), то и решения нет, или оно неправильное. А красивое и правильное - это не одно и то же.

Это тебя сильно торкнуло. Тоже садись мемуары в легком эпистолярном
жанре писать. Только не очередное "Трое в серверной". Я даже почитаю. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557954
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СПМ> Вообще-то мне это некогда ДЕ подсказал, я попробовал и понравилось :)

Это некошерно. Трюки с плюсиками кошернее.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39558035
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

трюки с плюсиком не помогут для уменьшения ширины резалсета под сортировку
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39558040
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

я в эпистолярном только в детстве писал. А "Трое в серверной" - Ковязина.
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Пихать ли в join все, что можно?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]