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

Посоветуйте, как ускорить выборку

Добавлено: 23 сен 2005, 11:54
Alexx
Есть ард-отчет вот с таким запросом

.create view t1 as select * from basefin, plpor, basedoc, groupsch
where ((word(2) == basefin.direct and
basefin.cplpor == plpor.nrec and
basefin.cbasedoc == basedoc.nrec and
plpor.cgroupsch == groupsch.nrec)) and
(basefin.tidkgal = 1 or basefin.tidkgal = 10) and
plpor.datvip >= dbegin and
plpor.datvip <= dkon and
groupsch.nrec = comp(gr_nrec);

Проблема в том, что работает он довольно долго, минуты 3-5 лопатит данные за 8 месяцев. Может подскажете, как его видоизменить, чтобы выборка шла быстрее.

Заранее, спасибо!

Добавлено: 23 сен 2005, 12:20
Den
В чем именно состоит задача. Опиши словами...

Добавлено: 23 сен 2005, 12:26
Алексей
.create view t1 as select * from basefin, plpor, basedoc, groupsch

попробуй сделать так:
.create view t1 from basefin, plpor, basedoc, groupsch

т.е. убарть "as select *"

тогда будут выбираться только поля, используемые в отчете.
Я когда убрал, отчет заработал в 4 раза быстрее, может и тебе поможет.

Добавлено: 23 сен 2005, 12:48
Alexx
задача - выбрать платежи с привязкой к ДО за определенный период и по определенной группе ДО

Добавлено: 23 сен 2005, 13:03
Den
юзай хотя бы тогда индекс BASEFIN09...а так конечно он у тебя долго будет отрабатывать.

Добавлено: 23 сен 2005, 13:29
Alexx
2Den

basefin09 это
direct+ddoc+nodoc

т.е. вместо
plpor.datvip >= dbegin and
plpor.datvip <= dkon and

юзать

basefin.ddoc >= dbegin and
basefin.ddoc <= dkon and

и плюс еще basefin.nodoc == plpor.nodoc

Так чтоли?

Добавлено: 23 сен 2005, 13:47
Den
.....
where ((word(2) == basefin.direct and
date(01,09,2005)<<=basefin.ddoc and
date(22,09,2005)>>=basefin.ddoc and
basefin.cplpor == plpor.nrec and
basefin.cbasedoc == basedoc.nrec
......

Добавлено: 23 сен 2005, 13:56
Alexx
прикол в том, что basefin.ddoc - это дата оплаты документа, если платежка не оплачена, то поле пустое, а мне необходимо выбирать по дате выписки платежки

Добавлено: 23 сен 2005, 14:45
Den
какая разница....беги тогда с plpor

.....
where ((Root==plpor.tidkgal
and (plpor.tidkgal=1 or plpor.tidkgal=10)
and date(01,09,2005)<<=plpor.datvip and
date(22,09,2005)>>=plpor.datvip and
plpor.nrec==basefin.cplpor
and basefin.cbasedoc == basedoc.nrec
.......
))
and (остальные фильтры)

Добавлено: 23 сен 2005, 15:44
WiRuc

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

.create view t1 
from basefin, plpor, basedoc, groupsch 
where ((
dbegin <<= plpor.datvip and
dend   >>= plpor.datvip and
comp(gr_nrec) == plpor.cgroupsch (noindex) and
plpor.nrec == basefin.cplpor and
(1 == basefin.tidkbase  or 10 == basefin.tidkbase) and 
word(2) == basefin.direct (noindex) and
basefin.cbasedoc == basedoc.nrec and 
plpor.cgroupsch == groupsch.nrec ))