2012-08-23 57 views
4

情況如下:如何查詢名稱存儲在SQL的另一個表中的表?

我有幾十個傳感器(可以說是100,000)。每個傳感器以(timestamp, value)的形式定期或不定期地產生定時值。步長可能小於1秒,因此在一年的過程中,對於特定傳感器可能會有數百萬個(timestamp, value)對,從而形成每個傳感器的時間序列。用戶可以針對這種時間序列的傳感器請求時間段(from, to)的值。

在一個表(sensor_id, timestamp, value)將填補表數十億每月值/行存儲所有的值。這蓋過傳統的開源數據庫系統(MySQL和PostgreSQL)。

我想到的創建每個傳感器的時間序列(timestamp, value)和參考表,在我的傳感器表(sensor_id, sensor_name, sensor_table_name)。所以會有每個一些百萬行10萬臺。

我可以獲取直接在我的傳感器直接使用sensor_table_name列中的值或做我必須做兩個查詢,一個得到sensor_table_name和一個得到數值超出該表?

+1

看看[這個問題](http://stackoverflow.com/questions/5772699/postgresql-dynamic-table-access)。它應該涵蓋你的情況。 –

+1

您是否對PostgreSQL進行了測試,因爲它是「開箱即用」的,或者您調整了服務器;分區表;使用適合於超大型數據庫(VLDB)的硬件,包括快速磁盤和額外的表空間;考慮將SSD用於某些索引或較小的表格;等等? –

+0

開箱即用;不幸的是不能改變硬件。你認爲PostgreSQL能以一種有用的方式處理例如600億個表項嗎? – AME

回答

0

如果您使用正常的關係數據庫,一個獲取sensor_table_name,另一個獲取表中的值,恐怕您需要執行兩個查詢。

2

這聽起來像是一個更好的解決方案,比動態生成SQL語句的名稱與傳感器匹配的名稱將使用table partitioning。你可以通過傳感器名稱進行分區,這樣可以正常工作。但是如果您不打算每年保留數十億次的讀數(沒有對其進行總結),那麼您可能希望按日期範圍進行分區,以使最終的數據清除更容易。

這可能比執行生成SQL語句更好,並且應該更容易管理。

+0

我有大約100.000個傳感器(更多來,有些去動態)。該分區的創建似乎有很多工作並且容易出錯。但我不確定。 – AME

+0

幾乎可以肯定,所有傳感器中的一個(可能是按日期分區)表中的數據要比100,000個或更多的數據表要好。性能不會超過許多表。 – kgrittn

+0

我猜約束排除不會根據傳感器ID擴展到100,000個分區進行分區,這就是爲什麼您建議按日期分區? –

3

如果對傳感器表名稱使用約定,則不必執行查詢即可找出要查詢某個傳感器的表。例如,如果您的傳感器ID是Wolverine967,並且您對這些表名稱的約定是Sensor_ +傳感器ID,那麼您會立即知道您可以查詢表Sensor_Wolverine967。

相關問題