![]() |
|
IT и Связь Обсуждение "айтишных" вопросов и средств связи |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Заслуженный Участник
|
![]()
дано табличка фактов,
типа [ (obj_id, measurement_id, dt (timestamp), value ] нада для всех [(obj_id,measurement_id)] вынуть последнее значение. решение влобь: [T1 = select obj_id,mea_id,max(dt) from T group by obj_id,mea_id] затем [join] Т1 с ишодной табличкой [on obj_id,mea_id,dt] (солнце восходит и заходит ... т.е. работает все) а другое решение есть ? |
![]() |
![]() |
Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок |
![]() |
#3 |
Спам-робот
|
![]()
Конечно есть
select value from T t1 left join T t2 on t1.obj_id=t2.obj_id and t1.mea_id=t2.mea_id and t1.dt<t2.dt where t2.dt is null Можно почесать репу и написать два-три еще более странных запроса что будут работать. Но вот зачем? Твой запрос медленно работает? Построй индекс по obj_id,mea_id,dt
__________________
My Church is Black... |
![]() |
![]() |
Благодарность от: | dzher (09.02.2010) |
![]() |
#4 |
Заслуженный Участник
|
![]() |
![]() |
![]() |
![]() |
#5 |
Спам-робот
|
![]()
От этого и пляши или кидай их сюда - я прикину как оптимально написать.
Или найди одмина, у тебя там по-любому секционированние нулевое, всю таблицу перелопачивать все равно, так что новый индекс будет правильное решение.
__________________
My Church is Black... |
![]() |
![]() |
![]() |
#6 |
My name is Exaybachay
|
![]()
Наиболее оптимальное решение я думаю находится если немного в предметную область глянуть. Например, можно предположить, что очень просто ищется диапазон dt сильно меньший общего количетсва данных, в котором _точно_ будут значения value для _всех_ пар obj_id, measurement_id и сразу отсекать его.
__________________
митьки никого не хотят победить |
![]() |
![]() |
![]() |
#8 | |
Просто Зануда
|
![]() Цитата:
![]()
__________________
The misuse of language induces evil in the soul © Socrates ![]() |
|
![]() |
![]() |
![]() |
#9 |
Заслуженный Участник
|
![]()
надо смотреть выборку.
скорее всего 2 индекса (или один двойной) по id есть точно. а дальше смотреть сколько записей выдают пары obj_id, measurement_id а то вдруг там всего 2-3 строки получается, тогда все индексы по дате - идут лесом. если получается тысячи строк - тогда другой раскалд
__________________
Для мод-ов: "звезду" лепить сюда [ ] ![]() Amicus Plato, sed magis amica veritas |
![]() |
![]() |
![]() |
#10 |
Заслуженный Участник
|
![]()
отчет:
оставил изначальный вариант; диапазон дат с"узить нельзя, результат - 30+к записей (столь и должно быть). в процессе борьбы выяснялось что: - первая часть задачи не [real-time] , посему пофиг две минуты оно выполняется или десять. - а вторая , [rt], решается другими стредствами ([mq]) всем спасиб. |
![]() |
![]() |
![]() |
#11 | |
My name is Exaybachay
|
![]() Цитата:
![]() ещё один вариант - апдейтить эти значения в другой таблице (tblLastValues какая-нибудь) сразу при добавлении данных (по триггеру или запросом добавления).
__________________
митьки никого не хотят победить |
|
![]() |
![]() |
![]() |
#12 | ||
Спам-робот
|
![]() Цитата:
![]() Цитата:
Это под серьезной нагрузкой - с десяток записей в секунду выдержут оба.
__________________
My Church is Black... |
||
![]() |
![]() |
![]() |
#13 |
My name is Exaybachay
|
![]()
такая уверенность может быть дана анализом требований и постановкой задачи. почему я и говорю - смотреть в предметную область.
опять же надо смотреть постановку задачи. писать в эту табличку возможно будет один тред с одного девайса (по крайней мере так многие системы контроля производства делают - некая софтина на одном компе собирает данные с девайсов контролирующих датчики - синхронно или асинхронно, держит буфер и пишет из него уже в базу отдельным тредом)
__________________
митьки никого не хотят победить |
![]() |
![]() |
Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок |
![]() |
#14 |
Заслуженный Участник
|
![]()
продолжим ?
дано: табличка "узкая и длинная" - [obj_id,mea_id,ts,val] надо: табличка "широкая и покороче" - [obj_id,mea_val1,mea_val2,...,mea_valN] [ts] выкинут - патамучта все [mea_valX] - распоследние (см пост #1) для малого кол-ва аттрибутов ([mea_id]-ей) делаем так: [ select T1.obj_id, T1.val, T2.val, ... Tn.val from T1 join T2 on T1.obj_id=T2.obj_id ... join Tn on T1.obj_id=Tn.obj_id ] [Tx] - ет те самые конструкции с [max(ts)]. для бОльшего кол-ва аттрибутов можно сделать так: (в ДБ2 аггрегируюшие функи типа [sum/avg...] пропускают пустые значения - [NULL]) [ select obj_id, sum(val1), ... sum(valN) from ( select obj_id, val1, null, ... null from T1 union all select obj_id, null, val2, ... null from T2 union all ... select obj_id, null, null, ... valN from Tn ) group by obj_id ] или вот так : табличка-результат создается заранее (заведомо достаточний ширины) [obj_id,mea_val1,...,mea_valNNN] множество [mea_id]-ев известно и хранится в массивчике/spiske "черная магия" (псеudокод): [ for i in <mea_id list> do merge into RESULT_TABLE r using (select obj_id,val from T where mea_id=$i) a on r.obj_id=a.obj_id when matched then update set mea_val$i = a.val else insert (obj_id,mea_val$i) values (a.obj_id,a.val) end do; ] now the Q - how do you do it ? |
![]() |
![]() |
![]() |
#15 | ||
Спам-робот
|
![]() Цитата:
![]() ![]() Цитата:
Даже я так делаю - а у меня этих датчиков многие сотни тыщ - но опять-же про аффтора нам ничего не известно. И строго говоря это есть избыточность что не всегда хорошо ![]()
__________________
My Church is Black... |
||
![]() |
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщ. |
Задачка. | Sleepwalker | Само приползло | 5 | 09.02.2009 12:21 |
Задачка для программистов | Mishka Na Servere | IT и Связь | 150 | 09.12.2008 11:52 |
Задачка для дитёв... | Arte | Само приползло | 13 | 18.09.2007 13:39 |
Задачка не про собачку... | Mark | Общие темы | 16 | 09.12.2003 10:07 |
Задачка про собачку | Наталия | Общие темы | 41 | 14.10.2003 12:42 |