我正在尝试优化复杂的 sql 查询,它将在每次地图绑定框更改时执行。我以为那INNER LATERAL JOIN
会是最快的,但事实并非如此。有谁知道如何加快这个查询以及如何更好地利用LATERAL JOIN
?
我做的最快的查询:
SELECT r0."id", r0."name"
FROM "hiking"."routes" AS r0
INNER JOIN "hiking"."hierarchy" AS h1 ON r0."id" = h1."parent"
INNER JOIN (SELECT DISTINCT unnest(s0."rels") AS "rel"
FROM "hiking"."segments" AS s0
WHERE (ST_Intersects(s0."geom", ST_SetSrid(ST_MakeBox2D(ST_GeomFromText('POINT(1285982.015631 7217169.814674)', -1), ST_GeomFromText('POINT(2371999.313507 6454022.524275)', -1)), 3857)))) AS s2 ON TRUE
WHERE (s2."rel" = h1."child");
计划时间:~0.605 ms 执行时间:~37.232 ms
实际上与上面相同,但使用LATERAL JOIN
,它更慢是正确的吗?
SELECT r0."id", r0."name"
FROM "hiking"."routes" AS r0
INNER JOIN "hiking"."hierarchy" AS h1 ON r0."id" = h1."parent"
INNER JOIN LATERAL (SELECT DISTINCT unnest(s0."rels") AS "rel"
FROM "hiking"."segments" AS s0
WHERE (ST_Intersects(s0."geom", ST_SetSrid(ST_MakeBox2D(ST_GeomFromText('POINT(1285982.015631 7217169.814674)', -1), ST_GeomFromText('POINT(2371999.313507 6454022.524275)', -1)), 3857)))) AS s2 ON TRUE
WHERE (s2."rel" = h1."child");
计划时间:~1.353 ms 执行时间:~38.518 ms
子查询中子查询最慢的查询(这是我的第一个,所以我对其进行了一些改进):
SELECT r0."id", r0."name"
FROM "hiking"."routes" AS r0
INNER JOIN (SELECT DISTINCT h0."parent" AS "parent"
FROM "hiking"."hierarchy" AS h0
INNER JOIN (SELECT DISTINCT unnest(s0."rels") AS "rel"
FROM "hiking"."segments" AS s0
WHERE (ST_Intersects(s0."geom", ST_SetSrid(ST_MakeBox2D(ST_GeomFromText('POINT(1285982.015631 7217169.814674)', -1), ST_GeomFromText('POINT(2371999.313507 6454022.524275)', -1)), 3857)))) AS s1 ON TRUE
WHERE (h0."child" = s1."rel")) AS s1 ON TRUE
WHERE (r0."top" AND (r0."id" = s1."parent"));
计划时间:~1.017 ms 执行时间:~41.288 ms