Показать сообщение отдельно
Старый 15.01.2003, 14:16   #4  
Lihgt is offline
Lihgt
Участник
 
46 / 70 (3) ++++
Регистрация: 16.04.2002
Адрес: Москва
Местная оптимизация
Повторю задачу:
Проанализировать предложенную оптимизацию на предмет ее применимости в наших условиях.

Что было сделано
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. У нас используются только РУБ, следовательно, все эти прелести не для нас
За это сообщение автора поблагодарили: raz (6), Logger (10).