Страница 1 из 1

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

Добавлено: 04 сен 2009, 15:11
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.

Добавлено: 04 сен 2009, 15:37
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
))
;

Добавлено: 04 сен 2009, 15:41
edward_K
1. уже обсуждалось - ищите
2. запрос все таки лучше переписать - на первое место поставить katmc, потом spstepб а потом уже stepdoc

Добавлено: 04 сен 2009, 16:10
sildae
Однако, в этом случае мне показывается только 1 ДО, а мне нужны все, в которых встречается МЦ.

Добавлено: 04 сен 2009, 16:17
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; 
Тогда в броузе вы увидите всю таблицу.

Добавлено: 04 сен 2009, 16:23
sildae
Спасибо, все теперь понятно и все правильно работает.