小编Ame*_*lle的帖子

未优化单行的 Postgres CTE 查询

我试图从我的数据库中获取用户统计信息的加权总和,并且我一次只会查询一个或两个用户的表,所以我将它写为一个视图。

由于它是一个视图,我假装计算表中每一行的总和,然后我希望优化器能够意识到当我只要求一行并优化查询时。然而,我的查询计划非常庞大,并且在其最里面计算了 170 亿行,我认为最多应该有 1000 行。

这是查询:

CREATE OR REPLACE VIEW weighted_stats AS
WITH 
    clf AS (SELECT * FROM classifiers order by time_trained desc limit 1),
    weights AS (SELECT kv.key, kv.value from clf, each(clf.weights) AS kv),
    kvs AS (
        SELECT stats.player_id, kv.key, kv.value FROM
        stats, each(stats.hstore_column) AS kv),
SELECT
    stats.player_id,
    SUM(kvs.value :: numeric * weights.value :: numeric) AS stats
FROM
    kvs JOIN weights USING (key)
GROUP BY kvs.player_id;
Run Code Online (Sandbox Code Playgroud)

这是查询计划:

explain analyze select * from weighted_stats where player_id=76561197960269296

GroupAggregate  (cost=53645.35..299471.72 rows=1 …
Run Code Online (Sandbox Code Playgroud)

postgresql cte view

5
推荐指数
1
解决办法
1256
查看次数

标签 统计

cte ×1

postgresql ×1

view ×1