PgSQL多维数据集选择优化
我有一个包含+1000万条记录的表,如下所示: 然后,使用PgSQL多维数据集,我希望找到所有最佳匹配项,这些匹配项按配方id区分,最大距离为20 我目前正在像下面这样做,但我相信可以做得更好。为了获得距离小于20的所有匹配,我需要将此示例代码中的限制5000增加到25000,这会影响查询执行时间。执行时间约为200毫秒。对于25000,它大约是1500ms,这太多了 有人对top如何优化它有什么想法吗?或者,如果有更干净/更好/更快的方法,可能会给我指出一个不同的方向PgSQL多维数据集选择优化,sql,postgresql,cube,Sql,Postgresql,Cube,我有一个包含+1000万条记录的表,如下所示: 然后,使用PgSQL多维数据集,我希望找到所有最佳匹配项,这些匹配项按配方id区分,最大距离为20 我目前正在像下面这样做,但我相信可以做得更好。为了获得距离小于20的所有匹配,我需要将此示例代码中的限制5000增加到25000,这会影响查询执行时间。执行时间约为200毫秒。对于25000,它大约是1500ms,这太多了 有人对top如何优化它有什么想法吗?或者,如果有更干净/更好/更快的方法,可能会给我指出一个不同的方向 SELECT *
SELECT
*
FROM ( SELECT DISTINCT ON (recipe_id)
name,
macros,
macros <-> CUBE (ARRAY [$gram_protein, $gram_carb, $gram_fat]) AS distance
FROM (
SELECT
R.name,
IR.macros,
IR.recipe_id
FROM
indexable_recipes IR
INNER JOIN recipes R ON IR.recipe_id = R.id
WHERE
R.id IN(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
ORDER BY
IR.macros <-> CUBE (ARRAY [$gram_protein, $gram_carb, $gram_fat])
LIMIT 5000) AS toplist
WHERE
macros <-> CUBE (ARRAY [$gram_protein, $gram_carb, $gram_fat]) < 20
ORDER BY
recipe_id,
distance) AS distincted
ORDER BY
distance
如果您需要将限制设置得足够高以捕获所有内容,为什么还要使用限制?请显示解释分析,查询缓冲区,最好在打开track\u io\u timing之后。您尝试过索引吗?我有一个限制,因为如果没有,它将需要很长的时间,也许30秒,找到所有的比赛。我相信使用不同的方法可以快速获得所有比赛。是的,我已经有一个索引,使用GIST索引,根据文档,这是KNN搜索的最佳选择。