FB 1.5.2
Имеем два варианта процедуры, которая возвращает одно и тоже (почти).
IDX_HISTORY_IUD_DATE_MDF - индекс по HISTORY_IUD.DATE_MODIFY
1 вариант:
Код: Выделить всё
FOR
SELECT MAX(U.FIO)
, COUNT(CASE WHEN (H.TABLE_NAME = 'PERSON' AND H.OPERATION = 1) THEN H.ID_USER ELSE NULL END)
, COUNT(CASE WHEN (H.TABLE_NAME = 'PERSON' AND H.OPERATION = 2) THEN H.ID_USER ELSE NULL END)
, COUNT(CASE WHEN (H.TABLE_NAME = 'PERSON' AND H.OPERATION = 3) THEN H.ID_USER ELSE NULL END)
, COUNT(CASE WHEN (H.TABLE_NAME = 'ANSWER' AND H.OPERATION = 1) THEN H.ID_USER ELSE NULL END)
, COUNT(CASE WHEN (H.TABLE_NAME = 'ANSWER' AND H.OPERATION = 2) THEN H.ID_USER ELSE NULL END)
, COUNT(CASE WHEN (H.TABLE_NAME = 'ANSWER' AND H.OPERATION = 3) THEN H.ID_USER ELSE NULL END)
FROM USERS U LEFT JOIN HISTORY_IUD H ON U.ID_USER = H.ID_USER
WHERE U.ID_USER NOT IN (1, 5, 6)
AND H.DATE_MODIFY BETWEEN :DATBEG AND :DATEND
GROUP BY U.ID_USER
ORDER BY 1
INTO :FIO
, :CNT_PERSON_I
, :CNT_PERSON_U
, :CNT_PERSON_D
, :CNT_ANSWER_I
, :CNT_ANSWER_U
, :CNT_ANSWER_D
DO BEGIN
SUSPEND;
END
------ Performance info ------
Prepare time = 31ms
Execute time = 94ms
Avg fetch time = 6,27 ms
Current memory = 3 146 276
Max memory = 3 493 148
Memory buffers = 2 048
Reads from disk to cache = 64
Writes from cache to disk = 3
Fetches from cache = 11 028
PLAN SORT (SORT (JOIN (U NATURAL,H INDEX (FK_USERS__OLD_PERSON,IDX_HISTORY_IUD_DATE_MDF))))
Код: Выделить всё
FOR
SELECT U.ID_USER
, U.FIO
FROM USERS U
WHERE U.ID_USER NOT IN (1, 5, 6)
ORDER BY 2
INTO :ID_USER
, :FIO
DO BEGIN
SELECT COUNT(CASE WHEN (H.TABLE_NAME = 'PERSON' AND H.OPERATION = 1) THEN H.ID_USER ELSE NULL END)
, COUNT(CASE WHEN (H.TABLE_NAME = 'PERSON' AND H.OPERATION = 2) THEN H.ID_USER ELSE NULL END)
, COUNT(CASE WHEN (H.TABLE_NAME = 'PERSON' AND H.OPERATION = 3) THEN H.ID_USER ELSE NULL END)
, COUNT(CASE WHEN (H.TABLE_NAME = 'ANSWER' AND H.OPERATION = 1) THEN H.ID_USER ELSE NULL END)
, COUNT(CASE WHEN (H.TABLE_NAME = 'ANSWER' AND H.OPERATION = 2) THEN H.ID_USER ELSE NULL END)
, COUNT(CASE WHEN (H.TABLE_NAME = 'ANSWER' AND H.OPERATION = 3) THEN H.ID_USER ELSE NULL END)
FROM HISTORY_IUD H
WHERE H.ID_USER = :ID_USER
AND H.DATE_MODIFY BETWEEN :DATBEG AND :DATEND
INTO :CNT_PERSON_I
, :CNT_PERSON_U
, :CNT_PERSON_D
, :CNT_ANSWER_I
, :CNT_ANSWER_U
, :CNT_ANSWER_D;
SUSPEND;
END
------ Performance info ------
Prepare time = 15ms
Execute time = 47ms
Avg fetch time = 1,62 ms
Current memory = 2 923 556
Max memory = 3 493 148
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 3
Fetches from cache = 14 699
PLAN (H INDEX (FK_USERS__OLD_PERSON,IDX_HISTORY_IUD_DATE_MDF))SORT ((U NATURAL))
1. Это происходит из-за группировки?
Ожидается что ANSWER будет рости очень быстро.
2. Что будет эффективнее при большом количестве записей?