1. 程式人生 > >PostgreSQL中Range型別例項

PostgreSQL中Range型別例項

     Range型別是 PostgreSQL中特有的資料型別,可以進行範圍快速搜尋。

     Range型別表示範圍。當然,用一個起始值和結束值也可以表示這個範圍,但其效率遠沒有Range型別高。下面通過例項解釋Range型別的用途。

    某個IP地址庫記錄了城市IP地址的範圍,現在需要查詢某一IP地址屬於哪個城市。

1.起始值和結束值

    建表,用兩列分別記錄IP地址的起始值和終止值。

CREATE TABLE ipRecord1 (
  ip_begin  inet, 
  ip_end  inet,
  city    text
);

    建索引,在記錄起始值和終止值的列上建立索引。

create index idx_ip_start on ipRecord(ip_begin);
create index idx_ip_end on ipRecord(ip_end);

  查詢某一IP地址屬於哪個城市。

select * from ipRecord where ip_begin<= '192.168.0.10'::inet and ip_end >='192.168.0.10'::inet;

   檢視SQL的執行計劃。

explain analyze verbose select * from ipRecord where ip_begin<= '192.168.0.10'::inet and ip_end >='192.168.0.10'::inet;

    從執行計劃上看,對索引進行範圍掃描還是不太高效。我們再嘗試使用Range型別,通過建立空間索引的方式來執行。

2. Range型別

    自定義Range型別

CREATE TYPE inetRange AS RANGE (subtype=inet);

    建表。

CREATE TABLE ipRecord2(
  ip_range inetRange,
  city text
);

    建立索引。

create index idx_ip_range on ipRecord2 using gist(ip_range);

    查詢某一IP地址屬於哪個城市。

select * from ipRecord2 where ip_range @>'192.168.0.10'::inet;

    檢視執行計劃。

explain analyze verbose select * from ipRecord2 where ip_range @>'192.168.0.10'::inet;