Re: Оптимизиция запроса
От: KisA Россия  
Дата: 12.08.03 11:02
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Есть обект у него есть UID унакальный идентификатор в пределах базы.

WH>В некий момент времени изменилось несколько полей что необходимо отразить в базе.
WH>Создается точка изменения (хранится UID, point_id, time). Далие в таблицу значений сохраняютсяизменившиеся поля(у каждого есть PID унакальный идентификатор в пределах объекта).
WH>Вобщем при работе программы получается такая штука строки — точки, столбци pid'ы. Желтые ячейки пустые.
WH>
WH>Задача такая:
WH>Есть point и несколько pid'ов(от 5 до 100) Надо выбрать из базы самые последние значения которые были записаны до и в заданной точки.
WH>Сейчас делаю так
WH>
WH>select *
WH>from
WH>(
WH>    select point, pid, [value]
WH>    from ValInt
WH>    where (point in (select point from points where uid=46 and point<=100000))
WH>)a
WH>where
WH>(
WH>    point in
WH>    (
WH>        select max(point)
WH>        from
WH>        (
WH>            select    point, pid
WH>            from ValInt
WH>            where (point in (select point from points where uid=46 and point<=100000))
WH>        )b
WH>        where    b.pid = a.pid
WH>    )
WH>)
WH>and (pid in (20,145,555,9834,876235))
WH>

WH>Но это медленно. И что самое противное время растет с увеличением размера базы.
WH>А когда много pid'ов план запроса превращается в страшного мутанта

А так попробовать:
select point, pid, [value]
from ValInt
where ( pid, point )
in
( select ValInt.pid, max( ValInt.point)
from ValInt join points on ValInt.point = points.point and points.uid = 46
where ValInt.point < 100000
and ValInt.pid in (20,145,555,9834,876235)
group by ValInt.pid
)