, - :
SELECT * FROM mytable a
WHERE NOT EXISTS ( SELECT *
FROM mytable b
WHERE ABS (a.long - b.long) < 0.01
AND ABS (a.lat - b.lat) < 0.02
AND b.id < a.id
);
UPDATE: ( , , ABS())
DROP TABLE tmp.mytable;
CREATE TABLE tmp.mytable
( id INTEGER NOT NULL PRIMARY KEY
, zlat REAL NOT NULL
, zlong REAL NOT NULL
);
INSERT INTO tmp.mytable (id, zlat, zlong)
SELECT generate_series(1,10000), 0.0, 0.0
;
SET search_path=tmp;
UPDATE tmp.mytable SET zlat = 39.0 + random() ;
UPDATE tmp.mytable SET zlong = 110.0 + random() ;
CREATE INDEX latlong ON tmp.mytable (zlat, zlong);
VACUUM ANALYZE tmp.mytable;
SET search_path=tmp;
EXPLAIN ANALYZE
SELECT * FROM mytable a
WHERE NOT EXISTS ( SELECT *
FROM mytable b
WHERE 1=1
AND ABS (a.zlong - b.zlong) < 0.01
AND ABS (a.zlat - b.zlat) < 0.02
AND b.id < a.id
);
EXPLAIN ANALYZE
SELECT * FROM mytable a
WHERE NOT EXISTS ( SELECT *
FROM mytable b
WHERE 1=1
AND a.zlong - b.zlong < 0.01 AND b.zlong - a.zlong < 0.01
AND a.zlat - b.zlat < 0.02 AND b.zlat - a.zlat < 0.02
AND b.id < a.id
);
, . , , () "(a-b) < 0,0x AND (b-a) < 0,0x". ABS() .
---------------------------------------------
Nested Loop Anti Join (cost=0.00..1448079.64 rows=9630 width=12) (actual time=0.151..3966.487 rows=1288 loops=1)
Join Filter: ((abs((a.zlong - b.zlong)) < 0.01::double precision) AND (abs((a.zlat - b.zlat)) < 0.02::double precision))
-> Seq Scan on mytable a (cost=0.00..263.00 rows=10000 width=12) (actual time=0.139..3.463 rows=10000 loops=1)
-> Index Scan using mytable_pkey on mytable b (cost=0.00..58.68 rows=3333 width=12) (actual time=0.005..0.173 rows=1084 loops=10000)
Index Cond: (b.id < a.id)
Total runtime: 3966.853 ms
(6 rows)
---------------------------------------------
Nested Loop Anti Join (cost=0.00..1663497.55 rows=9959 width=12) (actual time=0.065..4210.616 rows=1288 loops=1)
Join Filter: (((a.zlong - b.zlong) < 0.01::double precision) AND ((b.zlong - a.zlong) < 0.01::double precision) AND ((a.zlat - b.zlat) < 0.02::double precision) AND ((b.zlat - a.zlat) < 0.02::double precision))
-> Seq Scan on mytable a (cost=0.00..263.00 rows=10000 width=12) (actual time=0.060..2.840 rows=10000 loops=1)
-> Index Scan using mytable_pkey on mytable b (cost=0.00..58.68 rows=3333 width=12) (actual time=0.005..0.173 rows=1084 loops=10000)
Index Cond: (b.id < a.id)
Total runtime: 4210.904 ms
(6 rows)