我们目前正在尝试改进一种系统,该系统允许用户按照未显示的字段对大量对象(> 100k)进行过滤和排序。由于可以动态选择字段,我们还计划动态构建查询。
这听起来并不太难,基本功能很容易完成,但问题在于数据的结构。在某些情况下,需要一些或多或少的昂贵的连接,这可能会导致一些非常昂贵的查询,特别是当这些连接被组合时(即select * from table join some_expensive_join join another_expensive_join ...
)。
过滤不会是一个大问题,因为我们可以使用交叉点。
但是,排序要求我们首先构建一个包含所有必要数据的表,如果通过一个巨大的select语句完成所有这些连接将变得非常昂贵。
所以问题是:有更有效的方法吗?
我能想到这样做:
这有意义吗?如果是的话,怎样才能在Postgresql 9.4中完成(我们目前无法升级9.5+解决方案,虽然欢迎现在没有帮助)。
答案 0 :(得分:1)
这有用吗,还是太琐碎了? (子查询可以是预制连接视图)
SELECT t0.id, t0.a,t0.b,t0.c, ...
FROM main_table t0
JOIN ( SELECT t1.id AS id
, rank() OVER (ORDER BY whatever) AS rnk
FROM different_tables_or_JOINS
) AS t1 ON t1.id=t0.id
JOIN ( SELECT t2.id AS id
, rank() OVER (ORDER BY whatever) AS rnk
FROM different_tables_or_JOINS2
) AS t2 ON t2.id=t0.id
...
ORDER BY t1.rnk
, t2.rnk
...
, t0.id
;