我试图从我的数据库中获取用户统计信息的加权总和,并且我一次只会查询一个或两个用户的表,所以我将它写为一个视图。
由于它是一个视图,我假装计算表中每一行的总和,然后我希望优化器能够意识到当我只要求一行并优化查询时。然而,我的查询计划非常庞大,并且在其最里面计算了 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)