Сообщение
Dmitry Dyachenko » 26 фев 2008, 18:43
Всем привет.
Вот основной запрос в процедуре.
SELECT
Agreements.BranchID,
/* список полей */
PrivateClients.ClientPrivID
FROM Accounts, Agreements, PrivateClients
WHERE Accounts.ContractID = Agreements.ContractID
AND PrivateClients.ClientPrivID = Agreements.ClientPrivID
AND agreements.enrolled <= :o_BalanceDate
AND Accounts.BalNumClassID IN (2,4,6,8,10,12,16,34,36,41,42,45,46,49,50)
PLAN JOIN (AGREEMENTS NATURAL, ACCOUNTS INDEX (IND_ACCOUNTS_CONTRACTID), PRIVATECLIENTS INDEX (IND_PRIVATECLIENTS_CLIENTPRIVID))
Он возвращает единицы миллионов записей. Дальше в цикле идут запросы, выбирающие одну запись из одной таблицы в каждом случае. Таких запросов много, но работает это достаточно быстро, объединение этого в один запрос не дало выиграша по производительности, хотя наверное просто мало пытались. Для каждой строки вызывается четыре раза datetostr из RFunc и strreplace ещё откуда-то (может наша, может из RFunc). Тут раньше была утечка памяти, может никкуда не далась и дело в этом. [Антон, на память посмотрите.] Также вызывается два раза другая процедура, как EXECUTE, делает запросы к архивной таблице. Больше ничего особенного вроде нет.