2015-06-03 72 views
2

我正試圖將大量的每日天氣數據存儲到postgreSQL數據庫中。這可能看起來並不是很多數據,但大約有95,000個站點,日常數據可能會回溯多達100年。這可能意味着數百萬條記錄(95,000 * 365 * 100)= 3,467,500,000。雖然這是一個高估,但我仍然不可能將所有的日常數據存儲在一個帶有站點ID的表格中作爲外鍵映射到帶有站點信息的另一個表格。組織這些數據以便按站查詢數據系列的最佳方法是什麼?我應該爲每個站點創建一個表格(將導致95,000個表格),還是應該爲每個區域嘗試更寬泛的表格?有什麼優點和缺點?任何幫助是極大的讚賞。SQL優化數據庫結構:NOAA數據

我的數據是這樣的:

Stations 
*ID 
-longitude 
-latitude 
-elevation 
-country 
-state 
-name 
... 

Weather 
*Station ID 
*Date 
-Precipitation 
-High Temp 
-Low Temp 
+0

爲什麼不使用表分區?該數據庫負責爲您創建和維護95000個獨立表格:http://www.postgresql.org/docs/9.1/static/ddl-partitioning。html –

+1

唉,在PostgreSQL中沒有內置的分區,你必須基本上推出你自己的或者使用外部工具,比如pg_partman。它也不能很好地擴展到數百或數千個表格。我強烈懷疑最好的選擇是用幾張大桌子讓事情變得簡單。 –

+0

按日期分區似乎是最合乎邏輯的。在34M行/年;它可能是每年或每5或10年。 – wildplasser

回答

2

這不是真的足夠的信息。

你在優化什麼:查詢性能,磁盤使用情況,更新速度?

  • 你正在運行什麼類型的查詢?
  • 您通常提取全部數據爲一個站(似乎不太可能)?日期範圍?
  • 如果按日期查詢,通常的分辨率是什麼:日,月,年?
  • 這些都是「天氣」表中的所有字段,還是隻是樣本?
  • 您通常會檢索單個值或多個不同的值嗎?
  • 你只是檢索這些值,或在數據庫中進行聚合/分析?
  • 什麼是您可以接受的查詢性能?

根據您回答這些,它可能是有意義的「聚成一團」你的數據(存儲超過每條記錄一天多;我假設,「日期」意味着它是一個單一的一天,或者是它更細粒度?),以減少行數。 Postgres的每行開銷相對較高 - 根據您的估計,只有行標題將佔用大約75GB。

或者,你可能需要調查是這樣的:https://github.com/citusdata/cstore_fdw

使用多個表的優點是比較小的索引的大小和(可能)的物理數據局部性。在極端情況下,每個station_id一個表格(而不是對您而言很實用),您根本不需要station_id上的索引,查詢最終可能是對您所需數據的簡單seq掃描。

缺點是許多數據庫操作涉及對所有表的線性掃描(特別是在計劃過程中)以及管理數據庫時更復雜。

典型的建議是把表的數量保持到幾百到也許幾千。當然,除非你有一個非典型的情況,而且你已經測試過它,並且它適合你。