Database-Design
優化大表設計
首先,我在數據庫方面完全是新手,但我的任務是加快對大量數據的查詢。(數億條記錄)目前的實現是一個非常簡單的數據倉庫,它是很久以前在 Oracle 中創建的。現有表沒有主鍵,但每條記錄都是唯一的。該表由下面列出的前兩列索引。
數據本身相當簡單:
- 設備 - 有多個設備具有唯一編號指示器
- 數據生成時間——每個設備每天在不同的隨機時間多次生成一組數據。每個數據集涵蓋多天。集合中各個數據點的採樣時間可以達到每秒。對於數據生成時間之前的時間,這些是測量結果。對於數據生成時間之後的時間,這些是設備對數據的預測。查詢通常會被提取一整天,用於比較給定設備的測量數據和預測數據(例如,設備預測未來需求的效果如何)
- 數據點的日期/時間
- 數據點 1
- 數據點 2
. . . 數據點 23
主要的查詢類型有:
- 給我一個設備生成的最新數據
- 給我某一天設備的所有數據(如上所述。)
- 給我設備在給定日期的數據生成時間
我加快查詢速度的想法是將表拆分為兩個表,如下所示:
元數據表 (前 3 個中的每一個都將被索引)
- 設備
- 數據生成時間
- day – 這將是一個新的索引數據點
- 主鍵 - 帶有設備編號、數據生成時間(141230073205 - 2014 年 12 月 30 日 07:32:05)和日期(150102 - 2015 年 1 月 2 日)的數字
數據點表 (上面的元數據表中的每個條目將有成千上萬個)
- 外鍵——指向上述元數據表中該特定點有效的主鍵
- 數據點的日期/時間
- 數據點 1
- 數據點 2。. . 數據點 23
所以,長話短說(為時已晚!):
- 這是加快查詢速度的有效方法嗎?
- 有沒有更好的方法來組織數據?
- 我還能做些什麼來減少查詢時間?
- 任何 sqlplus 編碼技巧也將不勝感激。
如上所述,我能夠拆分錶格。由於我事先不知道數據生成時間,因此上述方法確實使查詢速度提高了 6 到 10 倍。
你的問題太寬泛了,這裡的任何答案都無法完全解決,所以我只談一點。對於“給我設備生成的最新數據”的主要查詢類型,您可以在表中創建一個新列,該列獲取與“數據生成時間”列相同的數據,然後有一個定期過程將舊值清空在每個設備的該列中只保留最後一個 N。然後可以創建一個基於函式的索引,該索引返回該行中存在數據的設備列,當該列為空時返回空。然後,查詢可以使用與該索引相同的功能,並且能夠在索引中查找設備的一小組數據并快速檢索它。