powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подклейка суммы из разных таблиц
16 сообщений из 41, страница 2 из 2
Подклейка суммы из разных таблиц
    #38497199
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПод "сортировка учитывается" мы понимаем "ретранслируется в результат", так?Да.

AkinaПро то, что это не файловая БД, уже сказали.Но у нас частный случай. Временная таблица, индексов нет, только что над ней был совершен файлсорт (как раз за счет сортировки по сумме). Чтение из этой таблицы будет идти в нужном нам порядке. Разве нет?

AkinaДопустим, порядок сортировки в подзапросе учитывается (непонятно, как, но допустим). Теперь представь, что у тебя ДВА подзапроса, и в каждом своя сортировка... Результат будет зависеть от порядка склейки таблиц в джойне. И для гарантии незыблемости результата нужно этот порядок явно указать оптимизатору с помощью straight_join.

Собственно, это можно проверить экспериментально. Вариант
.. (select ..transactions .. group by .. order by..) straight_join info ..
всегда даст результат с правильной сортировкой как не извращайся над исходными данными (хоть PK переопределяй). Это является док-вом?
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38497400
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanРезультат будет зависеть от порядка склейки таблиц в джойне. И для гарантии незыблемости результата нужно этот порядок явно указать оптимизатору с помощью straight_join.
Мне категорически не нравится утверждение что результат недетерминирован и зависит от порядка связывания.

retvizanСобственно, это можно проверить экспериментально. Вариант
.. (select ..transactions .. group by .. order by..) straight_join info ..
всегда даст результат с правильной сортировкой как не извращайся над исходными данными (хоть PK переопределяй). Это является док-вом?
Никакое количество экспериментов, кроме исчерпывающего, не является доказательством теории.
Я же имею обратный опыт - неявная сортировка в порядке следования первичного ключа, которая наблюдалась на рабочей системе несколько лет, однажды ушла в небытие. И так же неожиданно восстановилась после чистки базы от древних данных. К счастью, сортировка там никому нафиг не была нужна.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38497548
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanдля гарантии незыблемости результата нужно этот порядок явно указать оптимизатору с помощью straight_join.

Собственно, это можно проверить экспериментально. Вариант
.. (select ..transactions .. group by .. order by..) straight_join info ..
всегда даст результат с правильной сортировкой как не извращайся над исходными данными (хоть PK переопределяй). Это является док-вом?Не является, потому что не верно. Если распараллелить запрос (для увеличения скорости обработки, конечно же!), то без явного указания ORDER BY в конце запроса SQL будет выполнять его так, как удобнее ему, а именно включать в итог порции данных в порядке завершения обработки на разных процессорах. В этом случае даже наличие кластерного индекса не будет определять порядок следования строк в итоге.

При этом, конечно, каждому отдельному процессору удобнее отрабатывать данные постранично, то есть, якобы, "в порядке их следования". Хотя любой UPDATE/DELETE, выполненный параллельно, этот "порядок" может нарушить.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38497551
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора именно включать в итог порции данных в порядке завершения обработки на разных процессорах
чего-чего?
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38497559
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowавтора именно включать в итог порции данных в порядке завершения обработки на разных процессорах
чего-чего?Есть ссылка, правда для MS SQL. Не думаю, что в этом плане MySQL ведет себя по-другому, хотя возможно и неправ
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38497566
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот, нашел: Reading Pages
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38503066
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Если распараллелить запрос (для увеличения скорости обработки, конечно же!), то без явного указания ORDER BY в конце запроса SQL будет выполнять его так, как удобнее ему, а именно включать в итог порции данных в порядке завершения обработки на разных процессорах. В этом случае даже наличие кластерного индекса не будет определять порядок следования строк в итоге.MySQL не умеет распараллеливать запрос.

AkinaretvizanРезультат будет зависеть от порядка склейки таблиц в джойне. И для гарантии незыблемости результата нужно этот порядок явно указать оптимизатору с помощью straight_join.
Мне категорически не нравится утверждение что результат недетерминирован и зависит от порядка связывания.Это было бы так, если полагаться на волю случая, например, что оптимизатор выберет нужный порядок следования, потому что это более выгодный вариант - последовательно читать результат временной таблицы и по индексу подклеивать нужные поля из первой таблицы. Тогда да - сегодня работает правильно, а завтра звезды иначе расположились. Но в моем примере речь идет о задокументированном операторе, который и определяет порядок связывания ,т.е. результат однозначно определен пока сам запрос не перепишем.

AkinaretvizanMySQL выполняет запрос последовательно: join, where, group by, having, order by, limit.Ты не поверишь, но это НЕ ТАК. Вот если полностью заблокировать оптимизатор - то да, но кому такой сервер будет нужен?Действительно, не верю:) Мы говорим о MySQL?
Разбирая запрос, по сути оптимизатор применяет ряд правил вида: если запрос имеет вид такой, то заменить так. Потом идет последовательное выполнение - join, where, group ...

Переписать подзапрос в джойн в некоторых случаях оптимизатор может, а наоборот нет.
И в нашем варианте 1 единственный способ исполнения это сделать сначала джойн, получить избыточную временную таблицу и по ней группировка (даже если на всю таблицу транзакций повесить покрывающий пк).
Или я что-то упускаю?
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38503144
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanНо в моем примере речь идет о задокументированном операторе, который и определяет порядок связывания ,т.е. результат однозначно определен пока сам запрос не перепишем.
Нет. STRAIGHT_JOIN определяет, что к чему прикручивать. Но вот как именно считывать отдельно взятую таблицу или индекс, модификатор не говорит. И сохранять следование записей в соответствии с каким-либо индексом - тоже не говорит. Это всё определит сервер на стадии выполнения. И если ему, например, не хватит оперативки - он первую половину уже отобранных записей сольёт в кэш, и продолжит выборку. А когда закончит - не станет сливать вторую, чтобы сперва вычитать и отдать клиенту первую, а после опять перечитать и отдать вторую. Если нет Order By (в т.ч. неявного, от группировки) - ему по барабану наличие каких-то там индексов, которые с конечными данными уже никак не связаны. Как быстрее, так и будет.

retvizanДействительно, не верю:) Мы говорим о MySQL?
Разбирая запрос, по сути оптимизатор применяет ряд правил вида: если запрос имеет вид такой, то заменить так. Потом идет последовательное выполнение - join, where, group ...
Да, мы говорим о MySQL.
Действительно, оптимизатор по сути есть детерминированный конечный автомат с грудой правил. Вот только входных данных у него гораздо больше, чем голый текст запроса и DDL используемых таблиц. Статистика данных и доступные ресурсы сервера влияют на конечное состояние зачастую гораздо сильнее DML-текста. А ты это влияние безусловно отбрасываешь в сторону.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38506671
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНет. STRAIGHT_JOIN определяет, что к чему прикручивать. Но вот как именно считывать отдельно взятую таблицу или индекс, модификатор не говорит. И сохранять следование записей в соответствии с каким-либо индексом - тоже не говорит. Это всё определит сервер на стадии выполнения. И если ему, например, не хватит оперативки - он первую половину уже отобранных записей сольёт в кэш, и продолжит выборку. А когда закончит - не станет сливать вторую, чтобы сперва вычитать и отдать клиенту первую, а после опять перечитать и отдать вторую. Если нет Order By (в т.ч. неявного, от группировки) - ему по барабану наличие каких-то там индексов, которые с конечными данными уже никак не связаны. Как быстрее, так и будет.Убедили. Спасибо за терпение.

AkinaretvizanДействительно, не верю:) Мы говорим о MySQL?
Разбирая запрос, по сути оптимизатор применяет ряд правил вида: если запрос имеет вид такой, то заменить так. Потом идет последовательное выполнение - join, where, group ...
Да, мы говорим о MySQL.
Действительно, оптимизатор по сути есть детерминированный конечный автомат с грудой правил. Вот только входных данных у него гораздо больше, чем голый текст запроса и DDL используемых таблиц. Статистика данных и доступные ресурсы сервера влияют на конечное состояние зачастую гораздо сильнее DML-текста. А ты это влияние безусловно отбрасываешь в сторону.Но это влияние другого рода: какой индекс использовать или выбрать фулскан, временная таблица в памяти или на диске и т.д.
Мое утверждение в следующем - в варианте 1
.. info join transactions .. group by .. order by ..
join всегда выполняется первым.
И какие параметры даже теоретически могут изменить этот порядок я представить не могу. Можно пояснение?
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38506839
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanМое утверждение в следующем - в варианте 1
.. info join transactions .. group by .. order by ..
join всегда выполняется первым.Этого я не оспариваю. Я оспариваю лишь выводы, которые вы из этого сделали.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38506999
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант 1.
.. info join transactions .. group by .. order by

Сначала идет джойн по индексу
.. info i join transactions t..
получится избыточная временная таблица без каких-либо индексов (`unique_field` tinytext, `value` int, `some_data` text). Т.е. к каждой строке лога транзакций мы добавляем текстовое поле из первой таблицы. Получившаяся временная таблица больше исходной таблицы транзакций.
Далее группировка будет идти по этой большой временной таблице без каких-либо индексов, т.е. всегда файлсорт.
Потом ещё один файлсорт за счет сортировки по сумме.


Вариант 2.
.. info join (select ..transactions .. group by .. ) .. order by

Сначала выполняется подзапрос. Есть возможность сделать группировку по индексу и кроме того получившаяся временная таблица будет меньше исходной таблицы транзакций (меньше вероятность, что уйдет на диск в отличии от первого варианта).
Далее джойн по индексу - последовательно читается временная таблица и для каждой строки из неё по уникальному индексу ищется соответствие в первой таблице.
Получается вторая временная таблица и далее файлсорт за счет сортировки по сумме аналогичный первому варианту.


Вывод: если лог тощий (одной записи из первой таблицы соответствует 1 запись в логе) вариант 2 не хуже чем вар1.
С ростом пухлости лога (когда одной записи из первой таблицы соответствует N во второй) вариант 1 становится гораздо хуже варианта 2 (чем дальше, тем больше).
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38507130
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizan,

Странно, а мне всегда казалось, что порядок такой но "построчный", то есть:

1. приклеиваем к каждой транзакции поле(я) из лога, и тут же проверяем на условия, группировки и ведем подсчет агрегата. Результат накапливается гораздо медленнее чем как-бы полная времянка. Строго по результату группировки.

По крайней мере, мои изыски с переменными показывали, что присваивание переменной в блоке where часто приводит к двойному, тройному присваиванию, по числу джойнов и проверок. То есть конечная обработка (группировка) строки результата идет сразу, а не сначала созхдается какая-то гигантская обощенная времянка.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38507131
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

блин. Кот нажал Enter раньше чем проверил текст. Сорри за опечатки. :)
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38507183
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109По крайней мере, мои изыски с переменными показывали, что присваивание переменной в блоке where часто приводит к двойному, тройному присваиванию, по числу джойнов и проверок. То есть конечная обработка (группировка) строки результата идет сразу, а не сначала созхдается какая-то гигантская обощенная времянка.Тоже сталкивался с такой проблемой в более простом примере где был всего лишь джойн 2ух таблиц без группировки, там фишка в том не ясно какие условия и в каком порядке применяются к той или иной таблице. В итоге результат зависел от наличия индексов и самих данных.
Если есть желание поковыряться в примере, то вот

Arhat109Странно, а мне всегда казалось, что порядок такой но "построчный", то есть:

1. приклеиваем к каждой транзакции поле(я) из лога, и тут же проверяем на условия, группировки и ведем подсчет агрегата. Результат накапливается гораздо медленнее чем как-бы полная времянка. Строго по результату группировки.Имею уверенность, что это не так, но на хлеб её, конечно, не намажешь. Возможно, это следствие глубокого заблуждения.
Кто-нибудь знает истину?
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38507246
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109retvizan,

Странно, а мне всегда казалось, что порядок такой но "построчный", то есть:

1. приклеиваем к каждой транзакции поле(я) из лога, и тут же проверяем на условия, группировки и ведем подсчет агрегата. Результат накапливается гораздо медленнее чем как-бы полная времянка. Строго по результату группировки.Посмотрел внимательно на эксплейн, поэкспериментировал с данными и должен признать - вы правы.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38507256
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizan,

пасибки. Вот сочиняя что-то похожее для mediam.ru (выборка по n товаров для каждой фирмы на страницу товаров) я пришел как раз к такому же результату. Но, чтобы обеспечить стабильность выборки пришлось заворачивать аж до 4 уровня подзапросы... Там та же задача: надо выдать из общей таблицы фирм (группа!), те которые имеют такой товар в прайсе (фильтр), не более чем по 4 строки для каждой. При этом сохранить пагинацию по фирмам (группам).

... но изучая вопрос, пришел именно к такому выводу...
...
Рейтинг: 0 / 0
16 сообщений из 41, страница 2 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подклейка суммы из разных таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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