powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подклейка суммы из разных таблиц
41 сообщений из 41, показаны все 2 страниц
Подклейка суммы из разных таблиц
    #38494822
Dwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dwr
Гость
Господа, помогите, пожалуйста, с нубской задачкой. Есть две условных таблицы, info и transactions:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE `info` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `unique_field` tinytext,
  `some_data` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

CREATE TABLE `transactions` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `unique_field` tinytext,
  `value` int,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;



В транзакции падает куча данных, с разным value и одинаковым unique_field. Мне нужно сложить все value в транзакциях и подклеить их к выборке из info по unique_field, попутно отсортировав вывод по убыванию SUM(value). Пробовал просто поочередно выбирать, но тогда у меня все значения value складываются :)
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38494881
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dwr,

Код: sql
1.
2.
3.
4.
select info,sum(value)
from info i
join transactions t on i.unique_field=f.unique_field
group by 1 order by 2 desc
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495053
Dwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dwr
Гость
tanglir,

да, что-то похожее я и сделал. Но тогда в sum(value) кладутся вообще все транзакции, а мне нужны только те, что с одинаковым unique_field. Условно наполнение такое:

Код: sql
1.
2.
INSERT INTO `info` (unique_field, some_data) VALUES ('some1', 'lalala'), ('some2', 'bebebe');
INSERT INTO `transactions` (unique_field, value) VALUES ('some1', 100), ('some1', 120), ('some1', 80), ('some2', 200)
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495067
Dwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dwr
Гость
...а должен получить

Код: sql
1.
2.
some1 | lalala | 300
some2 | bebebe | 200
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495114
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dwrчто-то похожее я и сделал. Но тогда в sum(value) кладутся вообще все транзакцииЗначит, сделал совершенно непохожее. Будь внимательнее.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495142
Dwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dwr
Гость
Akina,

да я уже проверил и перепроверил несколько раз, все как по учебнику. А еще выбирается только первый unique_field, второй и последующие не выбираются. Может быть, проблема в одинаковых id?
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495150
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите свой запрос, что ли...
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495165
Dwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dwr
Гость
Akina,

Код: sql
1.
2.
3.
select i.*,sum(value)
from info i
join transactions t on i.unique_field=t.unique_field
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495239
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну! а я что говорю... Где в твоём запросе, жёваный крот, группировка? перепроверил он...
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495275
Dwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dwr
Гость
Akina,

а-а-а!.. "Признаю свою вину, меру, силу, глубину".

/me стыдно очень-очень.

Спасибо всем за помощь!
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495280
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dwrда я уже проверил и перепроверил несколько раз, все как по учебнику. А еще выбирается только первый unique_field, второй и последующие не выбираются. Может быть, проблема в одинаковых id?
Неправильный учебник. Проблема в том, что вы неправильно делаете группировку. Подробнее см http://sqlinfo.ru/forum/viewtopic.php?id=6240

Окончательный запрос нужен вида
.. from info join (подзапрос с группировкой) ..
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495343
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanОкончательный запрос нужен вида
.. from info join (подзапрос с группировкой) ..А вот это уже с потолка взято.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495419
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaretvizanОкончательный запрос нужен вида
.. from info join (подзапрос с группировкой) ..А вот это уже с потолка взято.
Почему?
Джойнить, а потом проводить группировку по текстовому полю первой таблицы - плохое решение с т.з. производительности.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495547
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanПочему?
Джойнить, а потом проводить группировку по текстовому полю первой таблицы - плохое решение с т.з. производительности.
Ну например потому, что при объёмном результате подзапроса он будет закэшен на диск.
Или потому, что прощай использование индекса. Вернее, и.
В общем, оверхед запросто может стать пухлее профита. А на реальной базе указанного назначения - гарантированно станет.

Кроме того, если поле группировки есть уникальное поле левой таблицы - то чхать с высокой колокольни на неправильность запроса с точки зрения классического сиквела.

Кстати, с какого потолка взято, что группить он собрался по тексту?
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38495942
Dwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dwr
Гость
>> если поле группировки есть уникальное поле левой таблицы
Все верно, уникальное.

>> группить он собрался по тексту?
Да. Вернее, по число-буквенному коду.

Кстати, никто не подскажет, как подсчитать кол-во строк с таким запросом? А то мне почему-то кажется, что выбирать их все для такой задачи - моветон. Но COUNT() глупости какие-то показывает...
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38496098
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot DwrCOUNT() глупости какие-то показывает...[/quot]
COUNT(DISTINCT info.id)
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38496124
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНу например потому, что при объёмном результате подзапроса он будет закэшен на диск.Не понял смысла фразы. Речь о том, что размер временной таблицы столь велик, что не поместится в памяти?

AkinaИли потому, что прощай использование индекса. Вернее, и.Здесь и так связь таблиц не по индексу.
А если был бы индекс, то к данным подзапроса по индексу клеим данные из первой таблицы.
Кроме того в случае индекса группировка в подзапросе хорошо на него ляжет.

AkinaВ общем, оверхед запросто может стать пухлее профита. А на реальной базе указанного назначения - гарантированно станет.Прошу пояснений.

AkinaКроме того, если поле группировки есть уникальное поле левой таблицы - то чхать с высокой колокольни на неправильность запроса с точки зрения классического сиквела.

Кстати, с какого потолка взято, что группить он собрался по тексту?Согласен, что группировать по всем полям здесь не нужно. Но все равно в результате джойна получиться большая временная таблица за счет повторяющегося текстового поля и группировка по ней всегда файлсорт, даже при наличии индекса на `unique_field`.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38496143
Dwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dwr
Гость
AkinaCOUNT(DISTINCT info.id)
Гранд мерси.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38496200
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanРечь о том, что размер временной таблицы столь велик, что не поместится в памяти?
Даже если она поместится - не факт что сервер не сольёт её на диск. А поскольку это лог, причём скорее всего пухлый - такой исход более чем вероятен имхо.

retvizanЗдесь и так связь таблиц не по индексу.
Таблицы, DDL коих приведены - не более чем модель, ТС об этом говорит. На боевой системе индексы просто обязаны появиться, чтобы получать результат за вменяемое время.

retvizanAkinaВ общем, оверхед запросто может стать пухлее профита. А на реальной базе указанного назначения - гарантированно станет.Прошу пояснений.
overhead - в данном случае дополнительные затраты ресурсов (в первую очередь времени);
profit - экономия ресурсов (тоже в первую очередь времени).

retvizanгруппировка по ней всегда файлсорт, даже при наличии индекса на `unique_field`.
Не знаю досконально начинки сервера и того, что именно он выберет для выполнения запроса, но группировка-то идёт по моему разумеению всё-таки не по тексту. ТС говорит про какой-то "число-буквенный код", но в структурах модели его нет, так что в этой точке мысль просто останавливается. А если потом окажется, что это некое уникальное (это указано явно) текстовое поле первой таблицы - то в процессе оптимизации ему воленс-неволенс придётся перейти на группировку по первичному индексу.
Сортировка же конечного набора по групповой функции SUM() - да, по-любому файлсорт, куда деваться.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38496233
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.. info join transactions .. group by .. order by -- вариант 1
.. info join (select ..transactions .. group by .. order by) -- вариант 2

AkinaretvizanРечь о том, что размер временной таблицы столь велик, что не поместится в памяти?
Даже если она поместится - не факт что сервер не сольёт её на диск. А поскольку это лог, причём скорее всего пухлый - такой исход более чем вероятен имхо. А если к каждой строке этого лога добавить до группировки `some_data` text из первой таблицы (вариант 1), то ситуация значительно ухудшится.


AkinaНе знаю досконально начинки сервера и того, что именно он выберет для выполнения запроса, но группировка-то идёт по моему разумеению всё-таки не по тексту. ТС говорит про какой-то "число-буквенный код", но в структурах модели его нет,Почему нет? `unique_field` tinytext,

В первом варианте у нас сначала выполняется join. На выход огромная временная таблица за счет повторения `some_data` text. Группировка при этом файлсорт даже, если есть индекс на `unique_field` (будь он хоть primary). А потом ещё и сортировка файлсорт на длинных строках за счет `some_data`.

Во втором варианте: группировка по индексу; сортировка файлсорт, но строки короче за счет отсутствия `some_data` text (правда нужен straight join). Связь же подзапроса с первой таблицей по индексу.

Мой вопрос про overhead и profit в том, что я не вижу за счет чего вариант 2 может быть хуже в отличие от обратного.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38496300
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanя не вижу за счет чего вариант 2 может быть хуже в отличие от обратного.
Ну во-первых, вариант 2 будет немного не таким, он будет

.. info join (select ..transactions .. group by ..) order by...

В случае сортировки в подзапросе она просто будет сервером проигнорирована.

Во-вторых, при наличии покрывающего индекса в первом варианте к таблице транзакций вообще не будет обращений.

И в очередной раз повторюсь - group by unique_field в любом случае есть БСК. Правда, в зависимости от того, из какой он таблицы, это будет разный БСК. Группить надо по первичному ключу.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38496320
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНу во-первых, вариант 2 будет немного не таким, он будет

.. info join (select ..transactions .. group by ..) order by...

В случае сортировки в подзапросе она просто будет сервером проигнорирована.
Почему проигнорирована? Можно ссылку?

Для оптимизации сортировки вар2 нужно переписать в виде

.. (select ..transactions .. group by .. order by..) straight_join info ..

тогда сортировка по сумме будет в подзапросе, а join добавит текстовые данные из первой таблицы к уже отсортированному результату.


Но сортировка вопрос вторичный, это незначительное улучшение. Основная мысль была в другом.
MySQL выполняет запрос последовательно: join, where, group by, having, order by, limit.
После того как мы сделали
.. info i join transactions t..
у нас получилась избыточная временная таблица без каких-либо индексов ( `unique_field` tinytext, `some_data` text, `value` int,). И уже по ней будет идти группировка. И никакие индексы в исходных таблицах исправить ситуацию не смогут. Собственно подзапрос и нужен, чтобы группировка шла по индексу.

А что такое БСК?
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38496426
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanЗдесь и так связь таблиц не по индексу.а в вашем варианте с подзапросом - уже нет, т.к. на базовых таблицах нужные индексы могут/должны быть, а на результат подзапроса их никак не повесить
retvizanПочему проигнорирована? Можно ссылку?а какую вам надо ссылку на то, что порядок записей в таблицах не учитывается? а результат подзапроса и является одной из таблиц...
retvizanА что такое БСК? http://ru.wikipedia.org/wiki/БСК
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38496428
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+
Ваш вариант может сработать лучше только в том случае, если свёртка таблицы transactions получится маленькой (меньше, скажем, 1000 записей) в то время, как исходных данных в transactions в разы, а лучше на порядки больше.
Если свёртка будет большой, то от этого будет только вред, почему, см.выше, Акина всё расписал.
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #38496456
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanПочему проигнорирована? Можно ссылку?
Под "сортировка учитывается" мы понимаем "ретранслируется в результат", так? впрочем, если нет - то я вообще не понимаю, о чём идёт речь...

Про то, что это не файловая БД, уже сказали. Но попробуй минимально включить логику.

Допустим, порядок сортировки в подзапросе учитывается (непонятно, как, но допустим). Теперь представь, что у тебя ДВА подзапроса, и в каждом своя сортировка...

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

Да, для того, чтобы перейти от программистского мышления к SQL-программистскому, просто жизненно необходимо воспринять эту концепцию - сперва получить всё потом отбросить ненужное. Однако сие вовсе не означает, что такая концепция реализуется на самом деле...
...
Рейтинг: 0 / 0
Подклейка суммы из разных таблиц
    #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
41 сообщений из 41, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подклейка суммы из разных таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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