Оптимизация процедуры
Добавлено: 10 дек 2004, 12:44
Привет всем!
FB 1.5.1
Помогите оптимизировать процедуру...
План ужасный:
В Person ~20 тыс. записей, в Answer ~50 тыс. записей. Понимаю что тормоза от моей криворукости, но что то я лучше придумать не могу... 
FB 1.5.1
Помогите оптимизировать процедуру...
Код: Выделить всё
CREATE PROCEDURE REP$AGE_DIAGRAM (
ID_ACTION INTEGER)
RETURNS (
AGE SMALLINT,
MEN INTEGER,
WOMEN INTEGER,
MEN_EMB INTEGER,
WOMEN_EMB INTEGER)
AS
BEGIN
/* Процедура для диаграммы по возрастам в разрезе мужчин и женщин */
FOR
SELECT DISTINCT (CURRENT_DATE - P.DOB) / 365
FROM PERSON P
WHERE EXISTS(SELECT A.ID_PERSON
FROM ANSWER A
WHERE A.ID_ACTION = :ID_ACTION
AND P.ID_PERSON = A.ID_PERSON)
ORDER BY 1
INTO :AGE
DO BEGIN
SELECT COUNT(*)
FROM PERSON P
WHERE P.SEX = 'м'
AND EXISTS(SELECT A.ID_PERSON
FROM ANSWER A
WHERE A.ID_ACTION = :ID_ACTION
AND P.ID_PERSON = A.ID_PERSON)
AND (CURRENT_DATE - P.DOB) / 365 = :AGE
INTO :MEN;
SELECT SUM(A.EMBEDDED_CNT)
FROM PERSON P LEFT JOIN ANSWER A ON P.ID_PERSON = A.ID_PERSON
WHERE P.SEX = 'м'
AND A.ID_ACTION = :ID_ACTION
AND (CURRENT_DATE - P.DOB) / 365 = :AGE
INTO :MEN_EMB;
SELECT COUNT(*)
FROM PERSON P
WHERE P.SEX = 'ж'
AND EXISTS(SELECT A.ID_PERSON
FROM ANSWER A
WHERE A.ID_ACTION = :ID_ACTION
AND P.ID_PERSON = A.ID_PERSON)
AND (CURRENT_DATE - P.DOB) / 365 = :AGE
INTO :WOMEN;
SELECT SUM(A.EMBEDDED_CNT)
FROM PERSON P LEFT JOIN ANSWER A ON P.ID_PERSON = A.ID_PERSON
WHERE P.SEX = 'ж'
AND A.ID_ACTION = :ID_ACTION
AND (CURRENT_DATE - P.DOB) / 365 = :AGE
INTO :WOMEN_EMB;
SUSPEND;
END
END
Код: Выделить всё
PLAN SORT (SORT ((P NATURAL)))JOIN (P NATURAL,A INDEX (FK_PERSON__ANSWER))(P NATURAL)(A INDEX (FK_PERSON__ANSWER))JOIN (P NATURAL,A INDEX (FK_PERSON__ANSWER))(P NATURAL)(A INDEX (FK_PERSON__ANSWER))(A INDEX (FK_PERSON__ANSWER))
------ Performance info ------
Prepare time = 0ms
Execute time = 24s 812ms
Avg fetch time = 775,38 ms
Current memory = 4 744 112
Max memory = 5 487 496
Memory buffers = 2 048
Reads from disk to cache = 1
Writes from cache to disk = 34
Fetches from cache = 11 853 020
