У меня есть таблица следующего вида:
[mytable]
id, min, max, funobj
-----------------------------------------
1 15 23 {some big object}
1 23 41 {another big object}
1 19 27 {next big object}
Теперь предположим, что у меня есть вид, созданный так:
CREATE VIEW functionvalues AS
SELECT id, evaluate(funobj)
FROM mytable
где оценка - функция, возвращающая множество, оценивающая большой funobj. Результат просмотра может выглядеть примерно так:
id, evaluate
--------------
1 15
1 16
1 ...
1 23
2 23
2 24
2 ...
2 41
...
У меня нет никакой информации о конкретных значениях, которые получит оценка, но я знаю, что они всегда будут между минимальными и максимальными значениями, указанными в mytable
(включая границы)
Наконец, я (или, что лучше, стороннее приложение) делает запрос на представление:
SELECT * FROM functionvalues
WHERE evaluate BETWEEN somevalue AND anothervalue
В этом случае Postgres выполняет оценку функции для каждой строки в mytable, тогда как, в зависимости от предложения where, функцию не нужно оценивать, если ее max и min не находятся между заданными значениями. Поскольку оценка является довольно медленной функцией, это дает мне очень плохую производительность.
Лучшим способом было бы запросить таблицу напрямую, используя
SELECT *
FROM (
SELECT id, evaluate(funobj)
FROM mytable
WHERE
max BETWEEN somevalue AND anothervalue
OR min BETWEEN somevalue AND anothervalue
OR (min < somevalue AND max > anothervalue)
) AS innerquery
WHERE evaluate BETWEEN somevalue AND anothervalue
Можно ли как-нибудь сказать postgres использовать запрос, подобный приведенному выше (с помощью умных индексов или чего-то в этом роде), не меняя способ, которым стороннее приложение запрашивает представление?
P.S .: Не стесняйтесь предлагать лучшее название для этого вопроса, тот, который я дал, довольно ... ну ... не конкретен.