回答

收藏

比较几何时查询慢

技术问答 技术问答 290 人阅读 | 0 人回复 | 2023-09-12

我正图比较和创建一个新的手表。但比较需要更多的时间。
* t; u7 O7 a$ D. D; ]4 Z) J表1(模式)8 M9 C, g6 p2 {
    ------------- ---------- ------------- | Column      | Type     | Modifiers   ||------------- ---------- -------------|| line_id     | bigint   |             || junction    | integer  |             || geom        | geometry |             | ------------- ---------- ------------- Indexes:    "points_geom_gix" gist (geom)联结包括0或1。: }$ G6 o4 X3 @+ B
表2( Z6 }; s# [: S, m8 U
    ---------- ---------- ------------- | Column   | Type     | Modifiers   ||---------- ---------- -------------|| line_id  | bigint   |             || geom     | geometry |             | ---------- ---------- ------------- Indexes:    "jxn_geom_gix" gist (geom)我想通过比较两个表的几何形状来创建一个新的表3。' b* u- [) ^) k4 e5 d
健康)状况. u  [3 r8 M2 v1 F1 r) i, i
从两个几何相等的表中选择几何。( [/ R( s% t# |3 _( J! N
从表1中选择geom,其中结点= 1,表3中不存在geom。
我尝试如下
$ f; x$ h' K4 B: n2 X0 N5 }CREATE TABLE table3 as select a.geom from table1 a,table2 b where st_equals(a.geom,b.geom);(在表3的geom列出创建要点索引)
# j2 x: @% u7 l& ]: F1 Y9 b9 h8 A1 Y! Z+ G: a6 @2 j
INSERT INTO table3 SELECT a.geom from table1 a,table3 b where a.junction = 1 and NOT st_equals(a.geom,b.geom);但是第二次查询需要很多时间。3 q, L1 ]1 a+ t$ i$ {# m
有人会帮我优化查询吗?
; A6 M1 m9 Y  c+ S- H' m5 u                                                               
! Q" c' X4 B' z1 G4 O* q  D4 r7 r    解决方案:                                                               
: x$ D7 b7 Y4 K7 X. X                                                                使用你的最后一个sql,你几乎会得到笛卡尔的结果。例如,如果表1中有1万个几何,junciton =
5 n; X4 M- K8 I7 b8 V! }; N1.表3中不存在,表3中还有1万个其他几何,所以对于每个juncition =; a  A, @4 D: }, C% g9 r3 f+ n
1的几何,您将返回10000行。在这种情况下,当您要查找不在其他表中的某些行时,请使用EXISTS它不会使结果翻倍,也不会产生笛卡尔坐标。
  v. C% k" X  YINSERT INTO table3 SELECT a.geom   from table1 a where a.junction = 1    and NOT exists (select from table3 b                     where st_equals(a.geom,b.geom)                      and st_DWithin(a.geom,b.geom,0));我编辑了查询-
/ {4 z: q' E( Y6 P+ m添加了st_Dwithin(a.geom,b.geom,0),它应该使查询速度更快,因为它不存在,它应该只比较它们之间的距离为0的几何(如果它们之间没有0的距离,它们肯定是不相等的)。st_dwithin将使用gist索引够近的相等几何进行索引筛选。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则