|
|
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
Вопрос по эстетике запросов. В упрощенном виде ситуация такая: Есть таблица клиентов - CLIENT_ID, CLIENT_NAME, ВСЯКИЕ_ДАННЫЕ, к ней справочник - скажем, улицы, STREET_ID, STREET_NAME. И есть таблица платежей клиента PAY, по одному клиенту много платежей - PAY_ID, CLIENT_ID, PAY_SUM.... Надо получить результат запроса в виде: данные клиента (CLIENT_ID, CLIENT_NAME, всякиеданные, в том числе из справочников - STREET_NAME...), и сумму всех его платежей. В чужом проекте это решается так: Код: sql 1. 2. 3. Как-то меня коробит этот зоопарк в GROUP BY. Я больше люблю, чтобы там были только ключевые поля. Я бы, наверное, извлекал данные из PAY подзапросом в составе селекта из CLIENT, или вообще джоинил разные запросы из CLIENT и из PAY. Это имеет какое-то основание, или я зря заморачиваюсь, и все нормально делают кучу всего в GROUP BY? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 19:59 |
|
||
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
Cane Cat FisherВопрос по эстетике запросов ... Код: sql 1. 2. 3. Как-то меня коробит этот зоопарк в GROUP BY. Я больше люблю, чтобы там были только ключевые поля. Я бы, наверное, извлекал данные из PAY подзапросом в составе селекта из CLIENT, или вообще джоинил разные запросы из CLIENT и из PAY. Это имеет какое-то основание, или я зря заморачиваюсь, и все нормально делают кучу всего в GROUP BY?Эстетика тут не причем. Делать так можно только от лени, плохая практика. Группировка по куче полей, включая символные даёт неплохой оверхид и может "убить" производительность очень сильно, особенно если такой запрос включается в другой запрос в качестве подзапроса. Лучше избегать подобного способа и групировать только по необходимым полям, дополнительно сливая результат с нужными таблицами для получения остальной информации. Как правило, это работает значительно быстрее, несмотря на дополнительные слияния. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 02:00 |
|
||
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
Cane Cat FisherКак-то меня коробит этот зоопарк в GROUP BY. Я больше люблю, чтобы там были только ключевые поля. Я бы, наверное, извлекал данные из PAY подзапросом в составе селекта из CLIENT, или вообще джоинил разные запросы из CLIENT и из PAY. Это имеет какое-то основание, или я зря заморачиваюсь, и все нормально делают кучу всего в GROUP BY?Я бы тоже группировал в подзапросе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 09:11 |
|
||
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
Как-то меня коробит этот зоопарк в GROUP BY. В принципе, это НОРМАЛЬНАЯ ПРАКТИКА. Запрос по-другому в нормальных СУБД не заработает. Я больше люблю, чтобы там были только ключевые поля. Я бы, наверное, извлекал данные из PAY подзапросом в составе селекта из CLIENT, или вообще джоинил разные запросы из CLIENT и из PAY. Если любишь, сделай группировку сначала по ключевым полям в подзапросе во FROM, а потом JOIN-и справочник клиентов и его дочерние к нему. И тот, и другой вариант запроса возможны, и они равнозначно имеют право на существование -- ни по производительности, ни по другим критериям нет резона не использовать один а не другой. Хотя -- некоторые СУБД не позволяют использовать подзапросы во FROM. Тогда -- только тот первый вариант, который тебе не нравится. Это имеет какое-то основание, или я зря заморачиваюсь, и все нормально делают кучу всего в GROUP BY? Практически не имеет. Есть на самом деле только один решительный довод ЗА твою точку зрения -- в СУБД суммарный размер ключей в GROUP BY может быть ограничен, и тогда твой вариант решения будет оправдан. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 12:16 |
|
||
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
Группировка по куче полей, включая символные даёт неплохой оверхид и может "убить" производительность очень сильно, особенно если такой запрос включается в другой запрос в качестве подзапроса. Лучше избегать подобного способа и групировать только по необходимым полям, дополнительно сливая результат с нужными таблицами для получения остальной информации. Как правило, это работает значительно быстрее, несмотря на дополнительные слияния. Да ладно. Нормальный оптимизатор запросто может сделать оптимизацию и убрать из группировки лишние поля и переставить JOIN-ы после группировки. Даже если это не будет сделано, накладуха там не большая -- только лишние сравнения текстовых полей. Это не дополнительные чтения. Ну и вообще говорить, что какие-то конструкции SQL заранее обречены на плохую производительность -- плохая идея. Данные, запрос, план, анализ -- тогда да, можно сказать, что так плохо, а так было бы лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 12:20 |
|
||
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
MasterZivДа ладно. Нормальный оптимизатор запросто может сделать оптимизацию и убрать из группировки лишние поля и переставить JOIN-ы после группировки. Даже если это не будет сделано, накладуха там не большая -- только лишние сравнения текстовых полей. Это не дополнительные чтения. Ну и вообще говорить, что какие-то конструкции SQL заранее обречены на плохую производительность -- плохая идея. Данные, запрос, план, анализ -- тогда да, можно сказать, что так плохо, а так было бы лучше.Не встречал таких оптимизаторов, которые в такой ситуации догадались бы убирать из группировки лишние поля с перестановкой джойнов. Это где такие ? "Накладуха" большая, по опыту, встречался с такими конструкциями неоднократно от разных авторов, "гробили" производительность на раз. Сравнение текстовых данных, тем более произвольной длины всегда приводят к излишним потерям на CPU. Чтения чтениям тоже рознь, физические против логических, хотя плохи и те, и другие, но первые значительно хуже. Можно, когда изучил много планов, то часто достаточно взгляда на конструкцию, которая может стать проблемой. Даже для самого продвинутого оптимизатора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 13:35 |
|
||
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
ChA, В субд накладные расходу в CPU - всегда более низших порядков, чем io. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 07:49 |
|
||
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
MasterZivВ субд накладные расходу в CPU - всегда более низших порядков, чем io.Естественно, но и не надо их считать уж вовсе ничтожными. При сравнениях символьных полей переменной длины и определённых видах сортировки это время сильно растёт с ростом объема обрабатываемых данных. Уверен, что наблюдали этот процесс и сами. Стоимость IO критична только если все данные при обработке не вмещаются в RAM, а при логических операциях чтения она сравнима с затратами на CPU. Так что соотношение начинает сильно смещаться в его сторону. Так у какой РСУБД настолько продвинутый оптимизатор, который в упомянутой выше ситуации догадался бы сам убирать из группировки лишние поля с перестановкой джойнов ? Может и правда настало время менять "лошадей" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 15:24 |
|
||
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
ChA, MSSQL, кстати, умеет - действительно, не бином ньютона определить, что если в GROUP BY есть первичный ключ таблицы, то остальные поля этой таблицы можно смело оттуда выкидывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 16:07 |
|
||
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
Кот МатроскинChA, MSSQL, кстати, умеет - действительно, не бином ньютона определить, что если в GROUP BY есть первичный ключ таблицы, то остальные поля этой таблицы можно смело оттуда выкидывать. ну вот и в пж такое послабление "с недавних" есть на GROUP BY pk http://www.sql.ru/forum/1054408/neozhidannoe-povedenie-group-by-pkey?mid=15010843&hl=group primary key#15010843 хотя для задачи автора у меня шаблон: сгруппировать голые ключи, а результат агрегации заджойнить на выборки значимых полей. Обычно дешевле (если не на коленки сиюсекундную выборку писать). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 16:54 |
|
||
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
Кот Матроскинне бином ньютона определить, что если в GROUP BY есть первичный ключ таблицы, то остальные поля этой таблицы можно смело оттуда выкидывать.Я это как бы и не оспариваю, это очевидно. Мнея интересовало, какая из РСУБД это умеет делать.Кот МатроскинMSSQL, кстати, умеетВот простейший пример, ничего лишнего(MS SQL 2008 R2 не слишком стар, надеюсь ?) Код: sql 1. 2. 3. 4. 5. 6. 7. План ____________________________________________________________ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Как мы видим, не выбрасывает, более того, добавляет Sort, чтобы выполнить "Stream Aggregate". Хотя зачем, собственно, по идее, дальше "Merge Join" выполнять уже не надо, результат уже получен. Хотя, признаю, что COUNT выполнен только по pr.[Data], честь ему и хвала, не стоят на месте, простейшие случаи уже понимают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 17:02 |
|
||
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
ChA, Ничего не понял. Какое отношение этот пример имеет к заглавному сообщению? Я говорил про то, что при конструкции Код: sql 1. оптимизатор сообразит выкинуть Name и группировать только по первичному ключу ID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 17:19 |
|
||
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
Кот Матроскинпри конструкции Код: sql 1. оптимизатор сообразит выкинуть Name и группировать только по первичному ключу ID.Так он, в принципе, сумел, только зачем-то начал делать сортировку и аггрегирование потока, что по любому, было излишне. Впрочем неважно, я согласен, что оптимизатор MS SQL Server 2008 R2 уже достаточно продвинут, чтобы понимать такую ситуацию в простых случаях. MS SQL Server 2000, например, даже по вашей конструкции, с добавлением идентификатора выполняет дополнительную сортировку и аггрегирование потока по символьному полю. Никогда не включал в группировку никаких полей, кроме действительно нужных, возможно пора менять старые привычки и больше доверять оптимизатору, время покажет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 18:06 |
|
||
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
Cane Cat FisherВопрос по эстетике запросов. В упрощенном виде ситуация такая: Есть таблица клиентов - CLIENT_ID, CLIENT_NAME, ВСЯКИЕ_ДАННЫЕ, к ней справочник - скажем, улицы, STREET_ID, STREET_NAME. И есть таблица платежей клиента PAY, по одному клиенту много платежей - PAY_ID, CLIENT_ID, PAY_SUM.... Надо получить результат запроса в виде: данные клиента (CLIENT_ID, CLIENT_NAME, всякиеданные, в том числе из справочников - STREET_NAME...), и сумму всех его платежей. В чужом проекте это решается так: Код: sql 1. 2. 3. Как-то меня коробит этот зоопарк в GROUP BY. Я больше люблю, чтобы там были только ключевые поля. Я бы, наверное, извлекал данные из PAY подзапросом в составе селекта из CLIENT, или вообще джоинил разные запросы из CLIENT и из PAY. Это имеет какое-то основание, или я зря заморачиваюсь, и все нормально делают кучу всего в GROUP BY? GROUP BY по 20-ти- 30-полям? да на каком ЕГЭ/ВУЗе учат собирать всё и вся в одну широкую простыню? какая-то тотальная шизА в конторах. СБ куда смотрит за такие выборки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 21:54 |
|
||
|
Группировка по имени, фамилии.... не нравится мне это
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher, А если через CTE? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2014, 15:53 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=30&tid=1540929]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
| others: | 14ms |
| total: | 161ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...