PostgreSQL中Range型別例項
阿新 • • 發佈:2018-12-15
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;