sql >> データベース >  >> RDS >> PostgreSQL

タイムスタンプに対する開始時刻と終了時刻の間のPostgreSQLマッチング間隔

    「temporalpostgres」(google it)がありましたが、それがまだ維持されているかどうかはわかりません...このタイプの検索をpostgresに含めることについての議論があったと思いますが、最終的な状態は覚えていません。とにかく:

    ボックスと要点の使用例:

    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
    

    ご覧のとおり、ここでは要点インデックスが途方もなく高速です(1500倍!笑)(オーバーラップ、包含、包含などの多くの演算子を使用できます。

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



    1. Oracleで作成する前に、テーブルが存在するかどうかを確認してください

    2. Oracle:UPSERTの方法(更新するか、テーブルに挿入しますか?)

    3. SQL Server(T-SQL)にテーブルをドロップする前にテーブルが存在するかどうかを確認する4つの方法

    4. MySQLは、あるデータベースから別のデータベースに挿入します