在不了解数据库的情况下,很难再现查询的逻辑,但我会尝试,所以要有耐心:
SELECT r0."id", r0."name"
FROM "hiking"."routes" AS r0
INNER JOIN "hiking"."hierarchy" AS h1 ON r0."id" = h1."parent"
WHERE
EXISTS (
SELECT 1
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)))
AND array[h1."child"] <@ s0."rels");
有两点:
-
按筛选数据
EXISTS
或
NOT EXISTS
有时通过加入
-
可以使用数组比较运算符,而不是取消对数组字段的测试以将其元素与某个值进行比较。有了适当的GIN索引,速度要快得多(文档
here
和
here
).
下面是一个简单的示例,说明如何在数组上使用索引以及如何更快地使用索引:
create table foo(bar int[]);
insert into foo(bar) select array[1,2,3,x] from generate_series(1,1000000) as x;
create index idx on foo using gin (bar); // Note this
select * from foo where 666 in (select unnest(bar)); // 6936,345 ms on my HW
select * from foo where array[666] <@ bar; // 45,524 ms