|
|
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
Добрый день всем. Есть таблица измерений : Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. t1,t2,h,p - это измерения. две температуры, какая-то там высота и давление. физически это не так важно. pid это id-шка устройства с которого считали эти измерения. каждое такое устройство выдаёт все измерения которые и записываются в таблицу за текущую дату - opdate . которая помимо даты содержит ещё и время. а теперь сама задача : требуется выяснить для каждого устройства в разрезе дней максимальное и минимальное значение каждого из измерений. и время когда они эти макс и мин были достигнуты . Пример pid t1 t2 h p opdate0 1115556 10.06.1990 13:000 3915569 10.06.1990 13:201 110355416 11.06.1990 13:001 54760 11.06.1990 13:301 1115556 10.06.1990 13:002 11015051560 10.06.1990 13:002 3178960 10.06.1990 13:23 скаежем устройство с id=0 дало результаты 10.06.1990 . для этого устройства будет только одна строка : pid date t1max t1maxDatet1minDate t1minDatet2maxt2maxDate t2mint2minDate hmax hmaxdate hmin hmindate pmax pmaxdatepmin pmindate010.06.19901113:00313:201513:00 913:2015513:205513:006913:20613:00 а для устройства с id=1 будет 2 строки так как там 2 различных даты (10.06.1990 и 11.06.1990) а для устройства с id=2 как и для устройства id=0 будет 1 строка так как там одна различная дата но с разным временем (10.06.1990 и 11.06.1990) сам запрос был мною сделан Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. но вот проблема уж очень много строк в таблицы - просто очень. дождаться не удаётся терпения , да и веб. запросы не должны столько работать. Как можно было бы оптимизировать такой запрос ? или индексов нарубить или ещё как ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 18:06 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
andron81, Попробуйте денормализовать таблицу - вынесите trunc (odate) в отдельное поле и постройте индекс на пару pid, newDate А потом что-нибудь типа этого: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 18:55 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
andron81, Пардон, забыл FROM, но в принципе понятно, куда его добавить :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 18:57 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
MAPA3OT, trunc это наверно из оракла. Но попробую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 19:54 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
andron81MAPA3OT, trunc это наверно из оракла. Но попробуюТам весь запрос из Оракла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 23:19 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
miksoft, И эти люди запрещают мне ковыряться пальцем в носу: FIRST_VALUE Пример в одну строку Про TRUNC погорячился, но ТС вполне себе сам знает про DATE() :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 23:48 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
MAPA3OT, А, 8-ая версия! Сорри, я с ней плохо знаком :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 23:49 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
Вот блин, я ещё и ROW вместо VALUE написал... Не-не-не-не, пора уже высыпаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 23:50 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
andron81в разрезе днейЕсли не требуется учитывать свежепоступившие данные, то можно предрассчитывать агрегаты за каждый день. А из них выборка будет работать уже быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2018, 23:53 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
miksoftMAPA3OT, А, 8-ая версия! Сорри, я с ней плохо знаком :) Так, всё равно надо в один проход, то бишь как-то через динамику, если мы забиваем на оконки. Пока в голове только откровенно уродливые идеи. Как вариант раз materialized view нет, одинокой тёмной ночью запускать заполнение таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 00:06 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
Да, что вы знаете о боевом безумии? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 00:40 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
miksoftandron81в разрезе днейЕсли не требуется учитывать свежепоступившие данные, то можно предрассчитывать агрегаты за каждый день. А из них выборка будет работать уже быстро. ну можно вообще вести таблицу итогов параллельно с наполнением . то есть инсертим в основную таблу + тут же делаем итоги в таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 07:55 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
andron81ну можно вообще вести таблицу итогов параллельно с наполнением . то есть инсертим в основную таблу + тут же делаем итоги в таблицу. Можно, но зависит от того, как часто идёт вставка. Пересчёт - это больно, опять же нужен явный лок на таблицу, может всё же тайная джобина глубокой ночью? Кстати, если вам нужна вся-вся-вся простынка с данными, то независимо от индексов и хитрых запросов вы упрётесь в размер, так что либо "урезайте осётра" (фильтр по датам), либо сторонняя таблица - ваш единственный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 09:57 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
MAPA3OT, да записи будут частые , но не думаю , что будет так уж "больно" . объясню и как вы считаете, поясните , пожалуйста (интересует мнение всех участников темы ) То есть ведём 2 таблы : ту что расписал в теме. и табличку итогов: (pid,date,t1max,t1maxDate,t1minDate,t1minDate,t2max,t2maxDate,t2min,t2minDate ,hmax ,hmaxdate,hmin,hmindate,pmax,pmaxdate, pmin,pmindate) 1. Появляется новая запись записываем в таблицу measurement, 2. А затем ищем запись по ключу (pid,date) в итоговой таблице и сравниваем c макс. показателями. ну то есть t1 сравниваем с t1max, t1 с t1min , t2 с t2max, t1 с t2min и т.д. заменяя эти значения если нашли макс (мин) и пробивая время в этих случаях. Разве это займет большие ресурсы ? а ещё вот такую штуку нашли для поиска значения других столбцов строки, содержащей минимальное или максимальное значение. возможно сэкономит ресурсы : ссылка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 11:09 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
andron81, потенциальная проблема в определении слова "часто" и в записях задним числом. Так (если запись задним числом невозможна) вообще можно раскидать на 2 таблицы и сделать связующую вьюху - то есть report_total, report_daily и view my_cool_report который union из предыдущих таблиц. Таким образом быстро апдейтим маленькую таблицу за день, условной ночью (спад нагрузки) перекидываем всё в большую таблицу и чистимся. Про MAX-CONCAT я собственно это в "боевом безумии и предложил" сдвиг всех чисел на 12 позиций (с учётом дробной части 14, в случае температуры - привести к положительному значению, ниже -273 по Цельсию не бывает)+дата в числовом формате, в пределах дня влиять не будет. Но опять же смотрите на вашу версию MySQL, может быть всё же оконки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 11:46 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
MAPA3OTandron81, потенциальная проблема в определении слова "часто" и в записях задним числом. Так (если запись задним числом невозможна) вообще можно раскидать на 2 таблицы и сделать связующую вьюху - то есть report_total, report_daily и view my_cool_report который union из предыдущих таблиц. Таким образом быстро апдейтим маленькую таблицу за день, условной ночью (спад нагрузки) перекидываем всё в большую таблицу и чистимся. Про MAX-CONCAT я собственно это в "боевом безумии и предложил" сдвиг всех чисел на 12 позиций (с учётом дробной части 14, в случае температуры - привести к положительному значению, ниже -273 по Цельсию не бывает)+дата в числовом формате, в пределах дня влиять не будет. Но опять же смотрите на вашу версию MySQL, может быть всё же оконки? ну а что плохого в проблеме (потенциальной как вы её назвали) ? Скажем есть запись в таблице итоги - назовем её ITOGO. (ограничимся параметром t1max) вот допустим там вот такая картина : piddatet1maxt1maxDate0 10.06.1990 11 13:000 11.06.1990 23 22:000 12.06.1990 5 06:001 10.06.1990 110 13:301 11.06.1990 230 22:051 12.06.1990 0.523 06:102 11.06.1990 20 22:052 12.06.1990 10 06:10 скажем сейчас 12.06.1990 07:20 и появилась новые показатели для pid=1 (в данном случае это только t1 как договорились) и их нужно записать в таблицу измерения measurement. пусть новая строка это добавляет для pid=1 значение 300. 1. Записываем в measurement. 2. Анализируем стоит ли обновить таблицу итоги исходя из новой строки measurement. для этого ищем в таблице строку по паре ключей (pid=1, date = 12.06.1990 ) смотрим есть , а это строка 1 12.06.1990 0.523 06:10 видим , что 300 > 0.523 , значит апдейтим строчку в итогах. в противном случае не трогаем. 3. Возможен варик когда в итогах не будет строки по ключам (pid, date) .тогда инсерт. Можете прокомментировать что тут будет так уж забивать ресурсы ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:16 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
andron81, в каждой бочке свои заморочки. Если в примере ваша стандартная частота обновления, то забудьте всё, что я писал. Всё будет хорошо. Просто каждый танцует от своей печки, а в моей печке сейчас немножечко (на порядк и ) веселее, поэтому, извините, спроецировал на вас. А забивать может (а вернее будет) триггер (или джоб) вместо тупого инсёрт будут инсёрт+селект (с локом таблицы, чтобы не напороться на одновременное изменение) + инсёрт/апдейт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:28 |
|
||
|
помогите расставить индексы или как-то ещё ускорить выборку
|
|||
|---|---|---|---|
|
#18+
MAPA3OTandron81, в каждой бочке свои заморочки. Если в примере ваша стандартная частота обновления, то забудьте всё, что я писал. Всё будет хорошо. Просто каждый танцует от своей печки, а в моей печке сейчас немножечко (на порядк и ) веселее, поэтому, извините, спроецировал на вас. А забивать может (а вернее будет) триггер (или джоб) вместо тупого инсёрт будут инсёрт+селект (с локом таблицы, чтобы не напороться на одновременное изменение) + инсёрт/апдейт. так может вы и правы ) может быть есть подводные камни. валиться строки могут по разному . с разной частотой )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 12:44 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=45&tid=1829524]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
86ms |
get tp. blocked users: |
2ms |
| others: | 255ms |
| total: | 417ms |

| 0 / 0 |

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