Галактика, возвраты и MSSQL
Добавлено: 10 окт 2006, 14:53
Имеем: Галактика 7.12 на MSSQL.
Хотим расчитать возвраты по с/ф.
Проблема: очень низкая производительность работы.
С помощью 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 данный запрос выполняется в один этап
Неужели разработчики не могли сделать оптимизацию, что если мы проходим с помощью loop по лог.таблице, то можно выполнить указанный выше запрос со всеми объединенными таблицами и затем уже на клиенте пройтись по полученному рекордсету?
Может кто-нибудь из посетителей форума "подсказать" разработчикам, что есть более разумные варианты, чем циклический перебор. Я уже просто устал письма писать разработчикам Галактики, все равно они их все игнорируют.
Хотим расчитать возвраты по с/ф.
Код: Выделить всё
.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
Может кто-нибудь из посетителей форума "подсказать" разработчикам, что есть более разумные варианты, чем циклический перебор. Я уже просто устал письма писать разработчикам Галактики, все равно они их все игнорируют.