我的應用程序允許用戶收集測量數據作爲實驗的一部分,並且需要能夠報告所有已測量的測量結果。Oracle 11g - 在數百萬行上執行分析功能
下面是我的表的一個非常簡化的版本:
CREATE TABLE EXPERIMENTS(
EXPT_ID INT,
EXPT_NAME VARCHAR2(255 CHAR)
);
CREATE TABLE USERS(
USER_ID INT,
EXPT_ID INT
);
CREATE TABLE SAMPLES(
SAMPLE_ID INT,
USER_ID INT
);
CREATE TABLE MEASUREMENTS(
MEASUREMENT_ID INT,
SAMPLE_ID INT,
MEASUREMENT_PARAMETER_1 NUMBER,
MEASUREMENT_PARAMETER_2 NUMBER
);
在我的數據庫中有2000個實驗,每個有18個用戶。每個用戶有6個樣品可以測量,每個樣品可以測量100個樣品。
這意味着當前存儲在數據庫中的數據量爲2000 * 18 * 6 * 100 = 21600000。
我想寫一個查詢,將得到每個用戶的測量參數1和2的AVG() - 這將返回約36,000行。
我的查詢速度非常慢 - 我已經運行了超過30分鐘,並且它沒有任何迴應。我的問題是:是否有一種有效的方法來獲取平均值?實際上是否可以在合理的時間內爲這些數據得到結果,比如說2分鐘?或者我是不現實的?
這裏有(再次簡化版本)查詢我:
SELECT
E.EXPT_ID,
U.USER_ID,
AVG(MEASUREMENT_PARAMETER_1) AS AVG_1,
AVG(MEASUREMENT_PARAMETER_2) AS AVG_2
FROM
EXPERIMENTS E,
USERS U,
SAMPLES S,
MEASUREMENTS M
WHERE
U.EXPT_ID = E.EXPT_ID
AND S.USER_ID = U.USER_ID
AND M.SAMPLE_ID = S.SAMPLE_ID
GROUP BY E.EXPT_ID, U.USER_ID
這將返回一個排的每個expt_id/USER_ID組合和2個測量參數的平均值。
這是一個聚合,而不是一個分析函數,它應該在數百萬行上正常工作(就像分析函數一樣)。你還沒有發佈任何索引的DDL,所以直接的懷疑是你沒有任何...你和他們是什麼? – Ben