我的应用程序允许用户收集测量数据作为实验的一部分,并且需要能够报告所有已测量的测量结果。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