Есть обект у него есть UID унакальный идентификатор в пределах базы.
В некий момент времени изменилось несколько полей что необходимо отразить в базе.
Создается точка изменения (хранится UID, point_id, time). Далие в таблицу значений сохраняютсяизменившиеся поля(у каждого есть PID унакальный идентификатор в пределах объекта).
Вобщем при работе программы получается такая штука строки — точки, столбци pid'ы. Желтые ячейки пустые.

Задача такая:
Есть point и несколько pid'ов(от 5 до 100) Надо выбрать из базы самые последние значения которые были записаны до и в заданной точки.
Сейчас делаю так
select *
from
(
select point, pid, [value]
from ValInt
where (point in (select point from points where uid=46 and point<=100000))
)a
where
(
point in
(
select max(point)
from
(
select point, pid
from ValInt
where (point in (select point from points where uid=46 and point<=100000))
)b
where b.pid = a.pid
)
)
and (pid in (20,145,555,9834,876235))
Но это медленно. И что самое противное время растет с увеличением размера базы.
А когда много pid'ов план запроса превращается в страшного мутанта