Мое приложение позволяет пользователям собирать данные измерений в рамках эксперимента и должно иметь возможность сообщать обо всех когда-либо проведенных измерениях.
Ниже приведена очень упрощенная версия таблиц, которые у меня есть:
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 и среднего значения двух параметров измерения.