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

Re: Синонимы

Добавлено: 22 май 2003, 15:36
paul
Когда время обработки становится не 2 минуты, а 40 секунд, это не повод для оптимизма. Для меня это глубокая депрессия, Народ. Ведь для обработки 50000 записей необходимо от 0.1 до 1.5 секунды.
Предлагаю свою версию:
Сортировка по Otkuda.nrec - не красива

.create view t as select otkuda.name,..,..
//Нина, не пиши *, а описывай конкретные поля - Не нужные поля заполняют драгоценный обьем ОП, от них очень тормозит сама сортировка.
from
//чуть-чуть помогает ключевое слово(ReadOnly)
katsopr(ReadOnly),
synonym katpodr otkuda(ReadOnly),
synonym katpodr kuda(ReadOnly)
where (( 600 == katsopr.vidsopr
and katsopr.cpodrfrom == otkuda.nrec
and katsopr.cpodrto == kuda.nrec))
order bykats by KatSopr.VidSopr
order byBar by Otkuda.Name;

....
.begin
t.SetOrder(tibyKatS)
if(t.GetFirst KatSopr = tsOk)
t.SetOrder(tibyBar)
end.
.{
.}

Re: Синонимы

Добавлено: 22 май 2003, 20:44
ecasoft
Это не пессимизма у меня - это здравый смысл. На самом деле я за 4 года разоаботки и 4 года внедрения Галактики ни разу не сталкивался с неразрешимой проблемой по быстродействию в Галактике. ВО КАКОЙ У МЕНЯ УРОВЕНЬ ОПТИМИЗМА :) А Вы говорите :)
По-моему, проблему всегда можно решить. В данном примере не известна полностью задача (вернее автор проблемы все уже решил там :) и смеется над нами (шучу)). Если все знать и знать чего там сколько в БД, то можно легко построить эффективный запрос..но НЕ ДЛЯ ВСЕХ, а конкретно для этой БД - в этом я уверен. А повышать эффективность ВООБЩЕ - это Вам с такими предложениями в Галактику - это интересует только их, т.к. они стараются делать эффективные решения ДЛЯ ВСЕХ. Но админам это ну нужно. Поэтому я и сказал, что мне надо переучиваться делать всегда максимально быстрые отчеты :) Я же решаю проблемы на конкретном предприятии.

И большая новость для меня, что если *, то значительнее медленне...как и параметр ReadOnly - убыстряет. По-моему, никакой СУЩЕСТВЕННОЙ помощи не окажут. ???

Вопрос не в памяти же, а в том сколько записей перебирается при анализе. А это зависит - идет поиск по индексу (Б-дереву) или просто перебором. В первом случае, как известно сравнений меньше по логарифмической зависимости, чем во втором.

С уважением, Игорь

Re: Синонимы

Добавлено: 22 май 2003, 20:45
ecasoft
Но больше всего мне нравится, что вопрос называется СИНОНИМЫ..все думаю, а при чем тут синонимы? :)

Re: Синонимы

Добавлено: 23 май 2003, 10:10
paul
Игорь
Анализ просто перебором я отметаю сразу. На счет (Б-дерева). Интересно, в кулуарах Г-ки расматривали ли вопрос оптимизации таблиц, т.е. Ночью сортировать записи на физическом уровне по индексу который я укажу, для того чтобы Таблица с МОИМ Индексом открывалась за доли секунды? А чистить удаленные записи ( типа функции PACK)?
Кстати, по быстродействию, если я убираю индексы, не нужные для нашего предприятия, производительность существенно растет.

Re: Синонимы

Добавлено: 23 май 2003, 12:59
Tais
ну здрасте, когда это я смеялась над вами?
по поводу * согласна с Игорем, не замечала я что то, что от нее тормозит, readonly использую, но иногда забываю (а использую потому как посоветовали - сказали так правильнее и быстрее). Чтоб разрешить вопрос все таки положу полностью фрмку (что было и как стало), дело в том что не я ее писала, мне пришлось корректировать чужую - получилось переписать почти полностью, посмотрите что стало со скоростью и зависит ли от количества записей в таблице и от * и от ридонли :) и смеюсь ли я (мне было не смешно когда такая "простая" проблема у меня не получалась). По поводу "синонимы" - второй раз столкнулась с ними и когда сортировка не пошла - появился вопрос, а может это из-за них? вот и спросила.
Когда описывала задачу - старалась сделать ее максимально видимой, поэтому убрала все "лишнее" ИМХО... а видимо оно не лишнее :)
Итак, что было:
.form '12345'
.ard
.var
mc,otkuda,kuda:string;
d1,d2:date;
kol_vag:string;
kol_vag_mc,kol,kol_po_mc:double;
nrecmc:comp;
.endvar
.create view mc as select * from katmc where katmc.classgr = 55;
.create view zan as select * from katsopr,synonym katpodr otkuda,synonym katpodr kuda,spsopr
where (( word(600) == katsopr.vidsopr
and d1 <<= katsopr.dsopr
and d2 >>= katsopr.dsopr
and '123' == katsopr.descr
and katsopr.cpodrfrom == otkuda.nrec
and katsopr.cpodrto == kuda.nrec
and katsopr.nrec == spsopr.csopr))
and spsopr.cmcusl = nrecmc;
.fields
d1 d2 cur_date cur_time
mc kol_vag_mc kol_po_mc
.endfields
.[h skip
рисовать лень, типа поля: матценность / кол-во вагонов / кол-во,т
.]h
.begin d2:=cur_date; d1:=date(1,month(d2),year(d2));
rundialog(getinterval,d1,d2); end.
заголовок формы
за период с ^ по ^
^ ^
матценность / кол-во вагонов / кол-во,т
.{table mc
.begin kol_po_mc:=0; nrecmc := mc.katmc.nrec;
mc := mc.katmc.name; kol_vag_mc:=0;
end.
.{table zan
.begin
otkuda:=zan.otkuda.kod; kuda:=zan.kuda.kod;
if zan.katsopr.ccellval = comp(40016FA47F8F585Eh) then kol_vag:=zan.katsopr.nvagon else kol_vag:='';
kol:=zan.spsopr.kol; kol_po_mc:=kol_po_mc+kol;
kol_vag_mc:=kol_vag_mc+integer(kol_vag);
end.
.} //zan
.{?internal;(kol_po_mc<>0)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ &&&&&&&&& &'&&&&&&&&.&&& 
.} // internal
.} // mc
.endform

за некрасивость названий переменных ответстенность с себя снимаю - не моя фрмка была

задача: вывести два поля склады - откуда и куда перемещали мц

вот что получилось в итоге:

.form '12345'
.ard
.var
mc,mcp,otkuda,kuda,otkudap,kudap:string;
d1,d2:date;
kol_vag:string;
kol_vag_mc,kolvag,kol_vag_mc1,kolvag1,kol_po_mc,kolmc,kol_po_mc1,kolmc1,kol:double;
nrecmc:comp;
k,m: boolean;
.endvar
.create view zan as select * from katmc,katsopr,synonym katpodr otkuda,synonym katpodr kuda,spsopr
where (( word(600) == katsopr.vidsopr
and d1 <<= katsopr.dsopr
and d2 >>= katsopr.dsopr
and '123' == katsopr.descr
and katsopr.cpodrfrom == otkuda.nrec
and katsopr.cpodrto == kuda.nrec
and katsopr.nrec == spsopr.csopr
and spsopr.cmcusl == katmc.nrec))
and katmc.classgr = 55
order by katmc.name,otkuda.kod,kuda.kod;
.fields
d1 d2 cur_date cur_time
mcp otkudap kudap kolvag1 kolmc1
mcp kolvag kolmc
mc otkuda kuda kol_vag_mc1 kol_po_mc1
mc kol_vag_mc kol_po_mc
.endfields
.[h skip
рисовать лень, типа поля: матценность / откуда / куда / кол-во вагонов / кол-во,т
.]h
.begin
d2:=cur_date; d1:=date(1,month(d2),year(d2));
rundialog(getinterval,d1,d2);
otkudap:=''; kuda:=''; kol_po_mc:=0; mcp:=''; kol_vag_mc:=0; kol_po_mc1:=0; kol_vag_mc1:=0;
end.
заголовок формы
за период с ^ по ^
^ ^
матценность / кол-во вагонов / кол-во,т
.{table zan
.begin
mc := zan.katmc.name;
kol:=zan.spsopr.kol;
if zan.katsopr.ccellval = comp(40016FA47F8F585Eh) then kol_vag:=zan.katsopr.nvagon else kol_vag:='';
if mc<>mcp then { m:=true; kolmc:=kol_po_mc; kol_po_mc:=kol; kolvag:=kol_vag_mc; kol_vag_mc:=integer(kol_vag); }
else { m:=false; kol_po_mc:=kol_po_mc+kol; kol_vag_mc:=kol_vag_mc+integer(kol_vag); }
otkuda:=zan.otkuda.kod; kuda:=zan.kuda.kod;
if otkuda<>otkudap or kuda<>kudap or mc<>mcp
then { k:=true; kolmc1:=kol_po_mc1; kol_po_mc1:=kol; kolvag1:=kol_vag_mc1; kol_vag_mc1:=integer(kol_vag); }
else { k:=false; kol_po_mc1:=kol_po_mc1+kol; kol_vag_mc1:=kol_vag_mc1+integer(kol_vag); }
end.
.{?internal;(k=true and otkudap<>'' and kuda<>'')
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @~@@@@@@@@@ @~@@@@@@@@@ &&&&&&&&&& &'&&&&&&&&.&&&
.}
.{?internal;(m=true) and mcp<>'')
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ &&&&&&&&&& &'&&&&&&&&.&&& 
.}
.begin
otkudap:=otkuda; kudap:=kuda;
mcp:=mc;
end.
.}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @~@@@@@@@@@ @~@@@@@@@@@ &&&&&&&&&& &'&&&&&&&&.&&& 
Итого по: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ &&&&&&&&&& &'&&&&&&&&.&&& 
.endform

не знаю, сняла ли все вопросы ко мне... но постаралась :)
понимаю, что вам может показаться то, как я пишу - смешно и не красиво, но со временем научусь :)
и было приятно получить столько откликов пусть даже и не совсем в мою сторону ;D
отдельное спасибо человеку (думаю прочтет), который посоветовал мне так поступить - одну таблицу сделать, а не две :)
С уважением, Нина.