2009-12-02 97 views
2

您好我有幾個數據庫,如mytable_2009_11_19_03哪裏最後2個數字標識小時(03:00表),現在我想查詢從_00到_23的東西。 它可以以這樣的方式來完成,但它確實是笨拙postgresql查詢多個相同的表

select * from mytable_2009_11_19_00 where type = 15 
UNION 
select * from mytable_2009_11_19_01 where type = 15 
UNION 
........... 
select * from mytable_2009_11_19_23 where type = 15 

我怎麼能做到這一點更容易? 關於

+0

爲什麼地球上那些在不同的桌子上? – 2009-12-02 10:29:28

+0

不好我的工作:)我只是查詢他們,可悲的是我的公司使用的軟件生成如此糟糕的設計表:> – Hellnar 2009-12-02 10:31:50

回答

1

最簡單的解決方案可能是建立一個所有表的視圖,然後你可以很容易地查詢它們。您可以輕鬆編寫一個過程來生成視圖。另外,如果你使用「union all」,如果你想要的結果是所有的行(與不同的行相對),並且你仍然可以通過在視圖中選擇不同的視圖來抓取不同的行。

3

如果您知道生成的所有表在模式中始終相同,則可以在PostgreSQL中創建父表並將新創建的表設置爲來自父級的INHERIT。

CREATE TABLE mytable_2009_11_19 (LIKE mytable_2009_11_19_00); 
ALTER TABLE mytable_2009_11_19_00 INHERIT mytable_2009_11_19; 
ALTER TABLE mytable_2009_11_19_01 INHERIT mytable_2009_11_19; 
. 
. 
. 
ALTER TABLE mytable_2009_11_19_23 INHERIT mytable_2009_11_19; 

SELECT * FROM mytable_2009_11_19 where type = 15; 

這是類似使用視圖,但也有區別(上市利弊在前):

  • (CON)此方法需要您能夠改變各個表,你可能沒有權利去做。 VIEW不需要這種訪問級別。
  • (CON)該方法要求表格都具有相同的結構,或者至少,父項必須只有所有子項之間的公共元素。
  • (PRO)要向VIEW添加表格,您必須刪除並重新定義VIEW(如果需要,還需要它的權限)。對於父表,通過使用INHERIT/NOINHERIT來更改每個表,可以很容易地添加或刪除表。 (PRO)如果您的模式包含日期和時間戳等字段,並且結構很少發生更改,您可以構建單個父表,並在滾動基礎上使用INHERIT/NOINHERIT來提供一個可以查詢的時間「窗口」不得不查詢整個歷史。
4

這個表結構聽起來像它打算成爲data partitioning scheme的一部分。這不是糟糕的設計。這是一件非常好的事情!

像這樣的基於時間的數據總是被添加到前端,並在其過期時被丟棄。使用一個巨大的表格會導致數據更新時產生大量的索引碎片,並導致VACUUM等操作的維護時間非常長。

如果您按照我包含在第一段中的鏈接閱讀關於分區的所有信息,那麼您將能夠使用CHECK約束快速進行日期搜索。任何包含WHERE時間戳記> x和時間戳記< y的SELECT都將很快。

現在,如果這些表不包含任何時間戳,那麼使用CHECK約束進行分區將不起作用,您將只需編寫腳本來爲您編寫笨拙的UNION查詢。

+0

非常感謝澄清,我總是喜歡聽到這樣的東西:=) – Hellnar 2009-12-22 21:38:35

相關問題