2013-07-25 1 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 измерений.

Я пытаюсь написать запрос, который получит AVG() параметров измерения 1 и 2 для каждого пользователя, который вернет около 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

Для вашего запроса в любом случае СУБД необходимо прочитать полную таблицу измерений. Это, безусловно, самая большая часть данных для чтения, а часть, которая занимает больше времени, если запрос оптимизирован хорошо (придет к этому позже). Это означает, что минимальное время выполнения вашего запроса - это время, затрачиваемое на чтение полной таблицы измерений из того, где она хранится. Вы можете получить приблизительную оценку, проверив, сколько данных (в МБ или ГБ), и проверьте, сколько времени потребуется, чтобы прочитать этот объем данных с жесткого диска (или где хранится таблица). Если ваш запрос выполняется медленнее в 5 или более раз, вы можете быть уверены, что есть место для оптимизации.

Информация о том, как оптимизировать запросы оракула, содержит огромное количество информации (руководства, индивидуальные подсказки, которые могут быть неоценимыми, и списки общих практик). Вы не получите всю эту информацию быстро. Но если вы предоставите план выполнения вашего запроса (это то, что оптимизатор запросов оракула считает лучшим способом выполнить ваш запрос), мы сможем определить шаги, которые можно оптимизировать и предложить решения.