Повторю задачу:
Проанализировать предложенную оптимизацию на предмет ее применимости в наших условиях.
Что было сделано
1. У заказа был установлен фиксированный курс валюты.
(метод adjustAmount вызывается, когда курс валюты заказа не совпадает с текущим курсом валюты)
2. В класс Tax добавлен счетчик, в котором суммировалось кол-во циклов в while select
3. В форме заказы выбираем пункт меню Запросы-Итоги и смотрим результат
В результате получили:
до оптимизации
1 строка - 2 итерации
2 строки - 8 итераций
3 строки - 18 итераций
4 строки - 32 итерации,
т.е. итераций = 2 * (строк ^ 2)... 100 строк -> 20000 итераций
после оптимизации
1 строка - 2 итерации
2 строки - 4 итерации
3 строки - 6 итераций
4 строки - 8 итераций,
т.е. итераций = 2 * строк ... 100 строк -> 200 итераций
Разница очевидна
А чтобы не жертвовать можно так поменять код
PHP код:
void adjustAmount(ExchRate _exchRate,
ExchRate _exchrateSecondary)
{
if (_exchRate)
{
ttsbegin;
while select forupdate taxWorkTrans
where taxWorkTrans.headingRecId == headingRecId &&
taxWorkTrans.exemptTax == NoYes::No
// Оптимизация расчета налогов (c) KURA & Lihgt -->
&& (taxCalculateTotal || taxWorkTrans.SourceRecId == this.sourceRecId())
// Оптимизация расчета налогов (c) KURA & Lihgt <--
{
...
P.S. У нас используются только РУБ, следовательно, все эти прелести не для нас