Мое приложение позволяет пользователям собирать данные измерений как часть эксперимента и должно иметь возможность сообщать обо всех сделанных измерениях.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.
Это совокупность, а не аналитическая функция, она должна хорошо работать на миллионах строк (как и аналитические функции). Вы не разместили DDL для индексов, поэтому непосредственное подозрение в том, что у вас их нет ... вы и что это такое? – Ben