Что быстрее и что для чего нужно:
Код: Выделить всё
_loop SKLORDER where ( SKLORDER.CSOPR = KATSOPR.nrec ) {
Код: Выделить всё
_loop SKLORDER where (( KATSOPR.nrec == SKLORDER.CSOPR )) {
Модераторы: m0p3e, edward_K, Модераторы
Код: Выделить всё
_loop SKLORDER where ( SKLORDER.CSOPR = KATSOPR.nrec ) {
Код: Выделить всё
_loop SKLORDER where (( KATSOPR.nrec == SKLORDER.CSOPR )) {
Код: Выделить всё
if ((getfirst SPSOPR where (
SPSOPR.CSOPR = KATSOPR.nRec and
SPSOPR.PRMC = 1 and
SPSOPR.CMCUSL = SPORDER.cMC and
SPSOPR.cParty = SPORDER.cParty and
SPSOPR.kol = SPORDER.kol and
SPSOPR.price = SPORDER.srprice
))<>tsok) {
Так вы проходите таблицу по циклу(_loop), а здесь берёте целую запись. Вообще используйте по возможности индексы, а то без них тормозить будет.n0where писал(а):А если мне надо сделать так:
индексов таких нет, в этом случае что быстрее?Код: Выделить всё
if ((getfirst SPSOPR where ( SPSOPR.CSOPR = KATSOPR.nRec and SPSOPR.PRMC = 1 and SPSOPR.CMCUSL = SPORDER.cMC and SPSOPR.cParty = SPORDER.cParty and SPSOPR.kol = SPORDER.kol and SPSOPR.price = SPORDER.srprice ))<>tsok) {
И по факту почему то у меня получается, что фильтр работает быстрее...
Все переносите во view, индекс есть cSopr + prMc + cmcUsl + cParty. Если по какому-то полю индекса нет, указываете noindex.n0where писал(а):А если мне надо сделать так:индексов таких нет, в этом случае что быстрее?Код: Выделить всё
if ((getfirst SPSOPR where ( SPSOPR.CSOPR = KATSOPR.nRec and SPSOPR.PRMC = 1 and SPSOPR.CMCUSL = SPORDER.cMC and SPSOPR.cParty = SPORDER.cParty and SPSOPR.kol = SPORDER.kol and SPSOPR.price = SPORDER.srprice ))<>tsok) {
И по факту почему то у меня получается, что фильтр работает быстрее...
Код: Выделить всё
_loop katsopr {
if getfirst spsopr where (karsopt.nrec = spsopr.csopr) { message('Ошибка - нет спецификации у документа') }
}
Код: Выделить всё
Create view
As Select
*
From
Katsopr
, SpSopr
Where
((
KarSopt.Nrec == SpSopr.cSopr
))
;
....
// Раз не указали Where, то используется подцепка из Create View. что кстати намного быстрее
_loop katsopr
if(GetFirst SpSopr<>tsOk)
{ message('Ошибка - нет спецификации у документа') }
// Еще ускорение. FastFirstRow - считывается по одной записи. Дает ускорение, когда явно известно что позиционирования на след запись не будет. Т.е. работаем без кэширования.
_loop katsopr
if(GetFirst FastFirstRow SpSopr<>tsOk)
{ message('Ошибка - нет спецификации у документа') }
// А это еще быстрее будет работать, т.к. только проверяется наличие в БД
// записи. при этом запись сама не считывается в буфер.
_loop katsopr
if (RecordExists SpSopr<>tsOk)
{ message('Ошибка - нет спецификации у документа') }
Ладно, getFirst where, но getFirst -то с каких пор стал нежелательным?) Что тогда вместо него использовать для позиционирования?edward_K писал(а):ообще getfirst where да и вообще getfirst плохой тон
Эти функции работают, если запись была предварительно считана в буфер. А если она считана не была, isValid не поможет, если необходимо узнать, существует ли в таблице запись. А RecordExists всегда посылает запрос к серверу.galover писал(а):RecordExists не всегда правильно работает, лучше отказаться от него в пользу IsValid (если view без имени) и IsValidAll (если вьюха именованная)
По собственному опыту пишу. RecordExists возвращал неправильное значение, заменил на IsValid все заработало, так что нафиг-нафиг. По поводу getFirst тоже не врубился в чем криминал, всегда использую, пока не подводилЭти функции работают, если запись была предварительно считана в буфер. А если она считана не была, isValid не поможет, если необходимо узнать, существует ли в таблице запись. А RecordExists всегда посылает запрос к серверу.