Почему так медленно работает запрос в vipe?

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
sildae
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 04 апр 2009, 15:56
Откуда: сАРАТОВ
Контактная информация:

Почему так медленно работает запрос в vipe?

Сообщение sildae »

Почему так медленно работает?
Сделала запрос по поиску МЦ в ДО
select basedoc.NODOC,basedoc.DDOC,katmc.barkod
from basedoc,spstep,stepdoc
where
((
stepdoc.cbasedoc==basedoc.nrec
and
spstep.CSTEPDOC==stepdoc.nrec
and
spstep.CMCUSL==katmc.nrec
))
and
katmc.barkod='4303249000145'
;

Отработало, решила сделать то же самое на VIP, чтобы вводить МЦ , а не менять ее в запросе. Работает в разы медленнее. Что я делаю не так?
nterface Bkod 'Поискать употребление МЦ в ДО' AlwaysReturn;
Var Bkod: string;
create view
as select BaseDoc.*
from basedoc,spstep,stepdoc
WHere
((
stepdoc.cbasedoc==basedoc.nrec
and
spstep.CSTEPDOC==stepdoc.nrec
and
spstep.CMCUSL==katmc.nrec
))
and
(katmc.barkod=Bkod)
;
Parameters
Bkod
browse BR1 ;
show at (,10,,);
fields
Basedoc.NoDOC 'Номер документа':[10], Protect;
Basedoc.DDOC 'Дата документа':[10], Protect;
Katmc.Barkod 'Баркод':[15], Protect;
end;
handleEvent
cminit: {
message (bkod,cmok);
}
end; //HandleEvent
!end;
end.
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение Ged »

))
and
(katmc.barkod=Bkod)
;

Это по сути безиндексная фильтрация логической таблицы - сначала отбираются ВСЕ stepdoc (она в данном случае главная), затем отбираются ВСЕ записи SpStep (и она тоже главная в данном случае),
затем в памяти начинается фильтрация по определенной МЦ.

1. что Вам мешает посмотреть наличие в KatMc необходимого индекса
KATMC07 = BARKOD+NAME
2. что Вам мешает посмотреть наличие в SpStep необходимого индекса
SPSTEP05 = PRMC+CMCUSL

И более корректно написать запрос

Код: Выделить всё

Create View
As
Select
  BaseDoc.*
From
  BaseDoc
, SpStep
, StepDoc
, KatMc
Where
((
     Bkod == KatMc.BarKod
And Word(1) == SpStep.PrMc  //Признак МЦ или Услуги
And KatMc.Nrec  == SpStep.cMcUsl
And SpStep.cStepDoc == StepDoc.Nrec
And StepDoc.cBaseDoc == BaseDoc.Nrec
))
;
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

1. уже обсуждалось - ищите
2. запрос все таки лучше переписать - на первое место поставить katmc, потом spstepб а потом уже stepdoc
sildae
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 04 апр 2009, 15:56
Откуда: сАРАТОВ
Контактная информация:

Сообщение sildae »

Однако, в этом случае мне показывается только 1 ДО, а мне нужны все, в которых встречается МЦ.
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение Ged »

Однако есть небольшая ошибка в инструментарии, которая решится с выходом Атл. 5.4.23.0

Код: Выделить всё

Browse BR1 ;
show at (,10,,);
 viewTable;   
fields
Basedoc.NoDOC 'Номер документа':[10], Protect;
Basedoc.DDOC 'Дата документа':[10], Protect;
Katmc.Barkod 'Баркод':[15], Protect;
end; 
Тогда в броузе вы увидите всю таблицу.
sildae
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 04 апр 2009, 15:56
Откуда: сАРАТОВ
Контактная информация:

Сообщение sildae »

Спасибо, все теперь понятно и все правильно работает.
Ответить