Оптимизиция запроса
От: WolfHound  
Дата: 12.08.03 05:47
Оценка:
Есть обект у него есть 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'ов план запроса превращается в страшного мутанта
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.