sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL matchningsintervall mellan start- och sluttid mot tidsstämpel

Det fanns "temporal postgres" (googla det) men jag vet inte om det fortfarande bibehålls... Jag tror att det fanns en diskussion om att inkludera den här typen av sökning i postgres men jag kommer inte ihåg det slutliga tillståndet för det. Hur som helst :

Exempel med box och gist :

CREATE TABLE segments( start INTEGER NOT NULL, stop INTEGER NOT NULL, range_box BOX NOT NULL );
INSERT INTO segments SELECT n,n+1,BOX(POINT(n,-1),POINT(n+1,1)) FROM generate_series( 1, 1000000 ) n;
CREATE INDEX segments_box ON segments USING gist( range_box );
CREATE INDEX segments_start ON segments(start);
CREATE INDEX segments_stop ON segments(stop);

EXPLAIN ANALYZE SELECT * FROM segments WHERE 300000 BETWEEN start AND stop;
 Index Scan using segments_start on segments  (cost=0.00..12959.24 rows=209597 width=72) (actual time=91.990..91.990 rows=2 loops=1)
   Index Cond: (300000 >= start)
   Filter: (300000 <= stop)
 Total runtime: 92.023 ms

EXPLAIN ANALYZE SELECT * FROM segments WHERE range_box && '(300000,0,300000,0)'::BOX;
 Bitmap Heap Scan on segments  (cost=283.49..9740.27 rows=5000 width=72) (actual time=0.036..0.037 rows=2 loops=1)
   Recheck Cond: (range_box && '(300000,0),(300000,0)'::box)
   ->  Bitmap Index Scan on segments_box  (cost=0.00..282.24 rows=5000 width=0) (actual time=0.032..0.032 rows=2 loops=1)
         Index Cond: (range_box && '(300000,0),(300000,0)'::box)
 Total runtime: 0.064 ms

Som du kan se är indexet löjligt snabbt här (1500 gånger! lol) (och du kan använda många operatorer som överlappningar, är innesluten, innehåller, etc.

http://www.postgresql.org/docs/8.2/static/functions-geometry.html



  1. mysqli eller PDO - vilka är för- och nackdelarna?

  2. Hur man väljer * men utan kolumnnamn måste vara unika i varje vy

  3. SQL Server BULK INSERT från Linux

  4. hur lagrar jag PostgreSQL jsonb med SpringBoot + JPA?