Хотим расчитать возвраты по с/ф.
Код: Выделить всё
.Create  view vMainRet
var cSchFact:comp;
as
select SpSopr.KolFact,SpSopr.doprttn,SpSchf.kolopl,SpSchf.Sum,SpSchf.Nds,SpSchf.PercNDS
from
  SpSchf,
  SpSopr SpSoprF,
  SpOrder,
  SpSopr
where
((
        cSchFact == SpSchf.cschfact
  and SpSchf.nrec == SpSoprF.cspschf
  and SpSoprF.nrec == SpOrder.cspsopr
  and SpOrder.nrec == SpSopr.csporder
));
...
vMainRet.cSchFact := nrec с/ф;
vMainRet._loop fullcache
{
         m_retkol := m_retkol + vMainRet.KolFact;
}
...
С помощью SqlProfiler смотрим какие запросы отсылаются на MSSQL.
Алгоритм работы Галактики получается такой:
1) Получить одну запись из SpSchf;
2) Получить одну запись из SpSoprF;
3) Получить одну запись из SpOrder;
4) Получить одну запись из SpSopr;
5) Выполнить пункт 4 для всех записей, подпадающих под условие SpOrder.nrec == SpSopr.csporder
6) Выполнить пункты 3 и затем 4 для всех записей, подпадающих под условие SpSoprF.nrec == SpOrder.cspsopr
7) И т.д.
Смысл в том, что обработка всех таблиц идет циклически по очереди.
Естественно, что это чрезвычайно медленно.
На SQL данный запрос выполняется в один этап
Код: Выделить всё
select SpSopr.KolFact,SpSopr.doprttn,SpSchf.kolopl,SpSchf.Sum,SpSchf.Nds,SpSchf.PercNDS
from
  SpSchf
  inner join SpSopr SpSoprF on SpSoprF.cspschf = SpSchf.nrec 
  inner join SpOrder on SpOrder.cspsopr = SpSoprF.nrec 
  inner join SpSopr on SpSopr.csporder = SpOrder.nrec 
where
  SpSchf.cschfact = cSchFact 
Может кто-нибудь из посетителей форума "подсказать" разработчикам, что есть более разумные варианты, чем циклический перебор. Я уже просто устал письма писать разработчикам Галактики, все равно они их все игнорируют.