從總體上來看,子表和分區表有相同的地方也有差異,由於都使用了繼承的特性,因此本質上是同樣的。下面看一下兩者的區別: 1.父子表: --建立父表 CREATE TABLE cities ( name text, population float, altitude int ); --建立子表 CREATE TABLE capitals ( state char(2) ) INHERITS (cities); INSERT INTO cities values('Las Vegas', 1.53, 2174); --插入父表 INSERT INTO cities values('Mariposa',3.30,1953); --插入父表 INSERT INTO capitals values('Madison',4.34,845,'WI');--插入子表 --在父表上作查詢,父表和子表的數據均被取出。 SELECT name, altitude FROM cities WHERE altitude > 500; Las Vegas 2174 Mariposa 1953 Madison 845 --查看執行計劃,實際上查詢從掃描了兩個表的數據,組合出想要的結果 explain analyze SELECT name,altitude FROM cities WHERE altitude > 500; Append (cost=0.00..24.54 rows=361 width=36) (actual time=0.008..0.012 rows=3 loops=1) -> Seq Scan on cities (cost=0.00..2.41 rows=38 width=36) (actual time=0.007..0.008 rows=2 loops=1) Filter: (altitude > 500) -> Seq Scan on capitals (cost=0.00..22.12 rows=323 width=36) (actual time=0.001..0.001 rows=1 loops=1) Filter: (altitude > 500) Planning time: 0.096 ms Execution time: 0.044 ms --在子表上作查詢,只能查出子表上的數據。 SELECT name, altitude FROM capitals WHERE altitude > 500; --若是隻想從父表中取數據,則須要在SQL中加入ONLY關鍵字,如: SELECT name,altitude FROM ONLY cities WHERE altitude > 500; 從這個例子看一看出,父子表使用了繼承的特性,子表能夠增長字斷,另外子表能夠繼承於多個父表。可是仍然有個疑問,有什麼卵用呢?? 2.分區表: 分區表也是使用繼承的特性,在邏輯上把一個大表分紅幾塊數據,分區的字斷和主表字斷一致,不會再另行增長字斷,另外能夠人爲定義約束,來約束每一個表上的數據不重複。 --建立主表示例: CREATE TABLE measurement ( city_id int NOT NULL, logdate date NOT NULL, peaktemp int ); --建立幾個子表,繼承父表全部字斷: CREATE TABLE measurement_yy04mm02 ( CHECK ( logdate >= DATE '2004-02-01' AND logdate < DATE '2004-03-01') ) INHERITS (measurement); CREATE TABLE measurement_yy04mm03 ( CHECK (logdate >= DATE '2004-03-01' AND logdate < DATE '2004-04-01') ) INHERITS (measurement);