Oracle 11g - 在数百万行上执行分析功能

时间:2013-07-25 14:59:39

标签: oracle oracle11g analytic-functions

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

以下是我所拥有的表格的简化版本:

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个测量参数的平均值。

1 个答案:

答案 0 :(得分:1)

对于您的查询,无论如何,DBMS需要读取完整的测量表。到目前为止,这是要读取的数据的最大部分,如果查询得到很好的优化,则需要花费大部分时间的部分(将在稍后介绍)。这意味着查询的最小运行时间是从存储它的时间读取完整测量表所花费的时间。您可以通过检查多少数据(以MB或GB为单位)并检查从硬盘(或存储表的位置)读取此数据量所需的时间来粗略估计。如果您的查询运行速度降低了5倍或更多,则可以确定存在优化空间。

有大量关于如何优化oracle查询的信息(教程,个人提示,这些信息非常有用,以及一般实践列表)。您无法快速了解所有这些信息。但是,如果您提供查询的执行计划(这是oracle的查询优化器认为是实现查询的最佳方式),我们将能够发现可以优化的步骤并建议解决方案。