2013-07-25 38 views
0

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

+0

这是一个聚合,而不是一个分析函数,它应该在数百万行上正常工作(就像分析函数一样)。你还没有发布任何索引的DDL,所以直接的怀疑是你没有任何...你和他们是什么? – Ben

回答

1

对于您的查询,无论如何,DBMS需要读取完整的测量表。这是目前读取数据最大的部分,如果查询优化得当(最终会出现),这部分将花费大部分时间。这意味着查询的最小运行时间大约是从无论存储完整测量表读取完成所需的时间。您可以通过检查有多少数据(以MB或GB为单位),并检查从硬盘读取这些数据量(或存储表的位置)需要多少时间,可以得出一个粗略的估计值。如果您的查询运行速度减慢5倍或更多,则可以确保有优化空间。

有大量关于如何优化oracle查询的信息(教程,可以是无价的个人提示和一般实践列表)。你不会很快完成所有这些信息。但是如果您提供查询的执行计划(这是oracle的查询优化器认为是实现您的查询的最佳方式),我们将能够找出可以优化并提出解决方案的步骤。