PgSQL多维数据集选择优化

PgSQL多维数据集选择优化,sql,postgresql,cube,Sql,Postgresql,Cube,我有一个包含+1000万条记录的表,如下所示: 然后,使用PgSQL多维数据集,我希望找到所有最佳匹配项,这些匹配项按配方id区分,最大距离为20 我目前正在像下面这样做,但我相信可以做得更好。为了获得距离小于20的所有匹配,我需要将此示例代码中的限制5000增加到25000,这会影响查询执行时间。执行时间约为200毫秒。对于25000,它大约是1500ms,这太多了 有人对top如何优化它有什么想法吗?或者,如果有更干净/更好/更快的方法,可能会给我指出一个不同的方向 SELECT *

我有一个包含+1000万条记录的表,如下所示:

然后,使用PgSQL多维数据集,我希望找到所有最佳匹配项,这些匹配项按配方id区分,最大距离为20

我目前正在像下面这样做,但我相信可以做得更好。为了获得距离小于20的所有匹配,我需要将此示例代码中的限制5000增加到25000,这会影响查询执行时间。执行时间约为200毫秒。对于25000,它大约是1500ms,这太多了

有人对top如何优化它有什么想法吗?或者,如果有更干净/更好/更快的方法,可能会给我指出一个不同的方向

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搜索的最佳选择。