Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Увеличить скорость расчета остатков
|
|||
|---|---|---|---|
|
#18+
В связи с тем, что объем таблиц для прихода и расхода увеличивается, расчет остатков стал длиться очень долго. Расчитываются остатки путем вычитания из прихода всего расхода. Не хотелось бы заниматься "резкой" таблиц по периодам, а м.б. поменять алгоритм или что нибудь еще... Товары приходуются в упаковках, расходоваться же могут упаковками и штуками. Пример выборки, которая и отрабатывает очень долго: SELECT r.id,r.cnt,sum(IIF(e.log=0,e.cnt,0)) as e_cnt,sum(IIF(e.log=1,e.cnt,0)) as e_cnt_p,; MAX(ALLTRIM(m.name)+IIF(ISNULL(p.name),'',' '+ALLTRIM(p.name))) as medname,; MAX(r.retailprice) as retailprice,; 000000000000+MAX(IIF(n.countinpack=0,1,n.countinpack)) as cntinpack, r.barcode as barcode,MAX(r.apptyme) as app_tyme ,; max(TTOD(d.date)) as date,'' as inv_no; FROM receipts r,expenses e,documents d,medications m,nomenclatures n LEFT OUTER JOIN produsers p ON n.prod_id=p.id; WHERE r.id=e.rcpt_id AND n.id=r.nom_id AND n.med_id=m.id AND d.id=r.doc_id AND d.closed AND d.store_id=goApp.nStoreHouse_ID AND d.closed; GROUP BY r.id,r.cnt, r.barcode ; UNION all; select r.id,r.cnt,0 as e_cnt,0 as e_cnt_p,; ALLTRIM(m.name)+IIF(ISNULL(p.name),'',' '+ALLTRIM(p.name)) as medname,r.retailprice,; 000000000000+IIF(n.countinpack=0,1,n.countinpack) as cntinpack, r.barcode as barcode,r.apptyme as app_tyme,; TTOD(d.date) as date,'' as inv_no; FROM receipts r,documents d,medications m,nomenclatures n LEFT OUTER JOIN produsers p ON n.prod_id=p.id ; WHERE n.id=r.nom_id AND n.med_id=m.id AND d.id=r.doc_id AND d.closed AND d.store_id=goApp.nStoreHouse_ID AND d.closed; AND NOT r.id in (select DISTINCT e.rcpt_id as id FROM expenses e ); INTO CURSOR _rest READWRITE далее куски кода отрабатыват достаточно быстро. В них происходит: REPLACE ALL e_cnt WITH cnt-e_cnt-CEILING(e_cnt_p/cntinpack),; e_cnt_p WITH IIF(MOD(e_cnt_p,cntinpack)=0,0,cntinpack-MOD(e_cnt_p,cntinpack)) Flt_Expr=IIF(m.tlWithNull,'','WHERE e_cnt#0 OR e_cnt_p#0') INSERT into rem_tg ; SELECT id , medname as name, retailprice as price ,e_cnt as cnt,e_cnt_p as cnt_p,cntinpack,barcode,app_tyme,date,inv_no ; FROM _rest &Flt_Expr &&WHERE e_cnt+e_cnt_p>0 USE IN _rest ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2004, 08:10 |
|
||
|
Увеличить скорость расчета остатков
|
|||
|---|---|---|---|
|
#18+
Подвешивает фокс ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2004, 09:31 |
|
||
|
Увеличить скорость расчета остатков
|
|||
|---|---|---|---|
|
#18+
luserПодвешивает фокс ? Несколько не понял формулировки вопроса.... выгребается на данный момент около 10 секунд. Фокс просто 10 секунд (если в отладке запускаю) не реагирует за события. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2004, 09:42 |
|
||
|
Увеличить скорость расчета остатков
|
|||
|---|---|---|---|
|
#18+
Думаю что и без отладки во время выполнения запроса реакции на события не будет. Ситуация распространенная при больших выборках, могу посоветовать выполнить запрос асинхронно, правда ля этого придется создавать COM-компоненту на VFP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2004, 10:20 |
|
||
|
Увеличить скорость расчета остатков
|
|||
|---|---|---|---|
|
#18+
luserДумаю что и без отладки во время выполнения запроса реакции на события не будет. Ситуация распространенная при больших выборках, могу посоветовать выполнить запрос асинхронно, правда ля этого придется создавать COM-компоненту на VFP. Не думаю, что асинхронный вариант что-то изменит, ведь проблема не в подвешивании. Народу ничего не нужно делать в момент выгребания данных и они нехотят ничего делать. Они хотят нажимать на кнопку и быстро получать результат... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2004, 10:34 |
|
||
|
Увеличить скорость расчета остатков
|
|||
|---|---|---|---|
|
#18+
Т.е. у тебя народ при выписке товаров жмет кнопочку и эти остатки вычисляются "на лету"? Меняй алгоритм! На sql.ru море дебатов и советов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2004, 13:23 |
|
||
|
Увеличить скорость расчета остатков
|
|||
|---|---|---|---|
|
#18+
Собственно говоря, а чего вы ожидали? Допустим вы соптимизируете запрос и вместо 10 секунд будете выполнять за 5, но с ростом таблицы приходов и расходов проблема будет только усугубляться. Подход у вас довольно прямолинейный, вам бы следовало хранить текущие остатки товаров в отдельной таблице (регистре текущих остатков), плюс завести таблицы остатков на начало периодов (чтобы при исправлении, удалении, пересчете операций пересчет остатков начинать с начала периода, а не с начала всей таблицы). При этом резать таблицу по периодам нет необходимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2004, 18:24 |
|
||
|
Увеличить скорость расчета остатков
|
|||
|---|---|---|---|
|
#18+
AiSKСобственно говоря, а чего вы ожидали? Допустим вы соптимизируете запрос и вместо 10 секунд будете выполнять за 5, но с ростом таблицы приходов и расходов проблема будет только усугубляться. Подход у вас довольно прямолинейный, вам бы следовало хранить текущие остатки товаров в отдельной таблице (регистре текущих остатков), плюс завести таблицы остатков на начало периодов (чтобы при исправлении, удалении, пересчете операций пересчет остатков начинать с начала периода, а не с начала всей таблицы). При этом резать таблицу по периодам нет необходимости. Согласен, с тем, что при росте таблиц скорость будет падать! Проблема в том, что если я пойду по пути расчета остатков на периоды и тем самым сокращу размеры таблиц, то это приведет к переписыванию большой части кода другими программистами. Хранить остатки в отдельной таблице или в дополнительных полях детализации прихода накладно, т.к. они могут не совпасть с реальными (опыт был у знакомых программистов на InterBase+Delphi). Как вариант думаю, увеличит ли скорость если при загрузке программы я буду помечать расходы и приходы как полностью "исчерпавшие себя", т.е. остаток = 0? Незнаю как отразится на скорости, т.к. придется ведь всеравно вначале покрайней мере работать с "полными" таблицами! Как думаете? Redrik Т.е. у тебя народ при выписке товаров жмет кнопочку и эти остатки вычисляются "на лету"? Меняй алгоритм! На sql.ru море дебатов и советов... Поможите направьте на алгоритм хотябы на пару ссылок!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2004, 06:55 |
|
||
|
Увеличить скорость расчета остатков
|
|||
|---|---|---|---|
|
#18+
www.sql.ru/forum/actualthread.aspx?tid=117869&pg=-1 и т.п. в "Проектировании..." Лично мне тоже нравится формирование остатков "на лету", но... К сожалению, объемы растут :-( Выход - отдельный справочник с остатками. ...могут не совпасть с реальными (опыт был у знакомых программистов на InterBase+Delphi). Ну, это уже проблема именно "знакомых программистов" :-))), а не самой методики! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2004, 10:06 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32753936&tid=1595536]: |
0ms |
get settings: |
9ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
84ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 255ms |
| total: | 453ms |

| 0 / 0 |
