Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос Fox 2.6 / 15 сообщений из 15, страница 1 из 1
28.10.2011, 12:32
    #37502354
СТАРЧЕ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
Если Вас не затруднит, помогите переделать прогу, а то слишком долго работает, приму любые варианты!!! Заранее большое СПАСИБО!!!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
_DATK = Date()
_DATN=_DATK-Day(_DATK)+ 1 
_Type= 0 
_Stok= 0 

@  5 ,  21  Say 'ВВЕДИТЕ ПЕРИОД ДЛЯ ФОРМИРОВАНИЯ ОТЧЁТА'
@  6 ,  21  Say 'Дата начала периода    ' Get _DATN
@  7 ,  21  Say 'Дата окончания периода ' Get _DATK
@  8 ,  21  Say 'Тип протокола          ' Get _Type
@  9 ,  21  Say 'Сток (Да-1, Нет-0)     ' Get _Stok
Read

Select Int(S.kgr/ 100000 ) As RG,S.kgr As kgr,S.KLIENT As KLIENT,S.NTR As NTR,;
	"                                                 " As GR,S.Mod As Mod,;
	S.KB As KOL,S.ZN As CEN,S.DATOT As DATOT, 0000000000 . 00  As SUME, NPR,;
	NPD,  00  As Coll,  00  As TM;
	FROM T0404038 S Into Table SNCEN.Dbf;
	WHERE DATOT>=_DATN .And. DATOT<=_DATK .And. kop<> 3  .And. NPR> 0 

*** Находим протоколы для стоков ***
_Npd= 0 
Sele SNCEN
Scan
	_MOD=Mod
	_ntr=NTR
	_kgr=kgr
	_NPR=NPR
	_Npd=NPD
	Sele t1082
	Seek Str(_MOD, 8 )
	_kl=nk
	Sele P_SNCEN
	Locate For NPR=_NPR And NPD=_Npd And DATD<=_DATK .And. Type=_Type
	If Found()
		_COLL=Coll
		Sele SNCEN
		Repl Coll With _kl, TM With _COLL
	Else
		Sele SNCEN
		Dele
	Endif
Endscan
...
Рейтинг: 0 / 0
28.10.2011, 12:45
    #37502396
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
Тормоз из-за этого
Код: plaintext
Locate For NPR=_NPR And NPD=_Npd And DATD<=_DATK .And. Type=_Type
чтобы что-то подсказать напиши какие есть индексы у таблицы P_SNCEN
и типы полей NPR, NPD, DATD, Type
...
Рейтинг: 0 / 0
28.10.2011, 12:48
    #37502411
СТАРЧЕ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
Dima T,

Индекс можно создать любой.
Но мне кажется, можно, как-то через запрос это сделать.
...
Рейтинг: 0 / 0
28.10.2011, 12:50
    #37502413
СТАРЧЕ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
Dima T,

NPR, NPD, DATD, Type - все numeric
...
Рейтинг: 0 / 0
28.10.2011, 12:52
    #37502422
СТАРЧЕ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
Dima T,

кроме datd - date

P.s. почему нельзя редактировать свои сообщения, после опубликации, очень не удобно.
...
Рейтинг: 0 / 0
28.10.2011, 12:57
    #37502440
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
СТАРЧЕDima T,

Индекс можно создать любой.
Но мне кажется, можно, как-то через запрос это сделать.
Можно, только если речь про Fox 2.6 то там только SELECTы и то очень ограниченные по возможностям были.

Наименее затратный способ - сделать индекс по одному из полей NPR, NPD, Type - взять то которое больше всего количество значений содержит. И проверку этого поля вынести в начало условия. Тога рашмор частично LOCATE оптимизирует.
Например если сделаешь индекс по NPD то так
Код: plaintext
Locate For NPD=_Npd And NPR=_NPR And DATD<=_DATK .And. Type=_Type
попробуй, если недостаточно ускорится, то попробуем более сложные варианты. Если б не было "<=" то можно было бы по всем полям индекс сделать и на SEEK заменить.
...
Рейтинг: 0 / 0
28.10.2011, 13:14
    #37502476
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
Второй вариант:
Сделай индекс str(NPR, 8) + str(NPD, 8) + str(Type,8) + dtoc(DATD, 1)
потом замени это
Код: plaintext
1.
	Locate For NPR=_NPR And NPD=_Npd And DATD<=_DATK .And. Type=_Type
	If Found()
на
Код: plaintext
1.
seek str(_NPR,  8 ) + str(_NPD,  8 ) + str(_Type, 8 )
If Found() and DATD<=_DATK

PS 8-ки исправь на свои размеры полей
...
Рейтинг: 0 / 0
28.10.2011, 13:51
    #37502579
СТАРЧЕ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
Dima T,

Попробую второй вариант, а то первый уже 50 мин. считает)
...
Рейтинг: 0 / 0
28.10.2011, 13:58
    #37502610
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
СТАРЧЕDima T,

Попробую второй вариант, а то первый уже 50 мин. считает)
Многовато :)
Быстрее второго вряд ли что придумать получится.
У тебя еще селект в начале, его не замерял, сколько он времени делается? Хотя там тоже нечего оптимизировать.
Разве что детально вникать в смысл считаемого и на корню менять принцип расчета.
...
Рейтинг: 0 / 0
28.10.2011, 14:08
    #37502646
СТАРЧЕ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
Dima T,

select 5-10 сек. выполняется, очень долгая обработка при replace и delete
...
Рейтинг: 0 / 0
28.10.2011, 14:10
    #37502656
СТАРЧЕ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
Dima T,

Кста второй вариант помог, обработка в 3 раза уменьшилась!!!!, спс тебе, мот еще, что-нибудь придумаешь?)))
...
Рейтинг: 0 / 0
28.10.2011, 14:19
    #37502688
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
СТАРЧЕмот еще, что-нибудь придумаешь?)))
Можно еще железо поменять на помощнее :)
...
Рейтинг: 0 / 0
28.10.2011, 14:40
    #37502741
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
Насчет железа есть еще такой момент - виндовс 2000/XP запускает дос-проги в эмуляторе дос-машины. Можно попробовать оптимизировать этот эмулятор правкой файла CONFIG.NT
Может оказаться что твой FPD использует 1Мб оперативки и тормозит из-за этого. Как проверить не скажу, должна быть какая-то функция для получения используемой памяти, давно с FPD не сталкивался, сейчас даже запустить негде. Win7x64 не дает досовские проги запускать.
Остались дистрибутивы одной досовской проги, там такое было:
В файл CONFIG.SYS (он же CONFIG.NT в 2000/XP) добавить
Код: plaintext
1.
2.
3.
4.
dos=high,umb
device=c:\windows\himem.sys
device=c:\windows\emm386.exe ram
files= 100 
buffers= 60 
Что это означает уже смутно помню, поэтому не буду умничать, если интересно - поищи в инете.
...
Рейтинг: 0 / 0
28.10.2011, 14:47
    #37502757
СТАРЧЕ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
Dima T,

Да это срабатывает, но у меня админы это прописывают всем, ток с более оптимальными параметрами.
...
Рейтинг: 0 / 0
28.10.2011, 17:26
    #37503195
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос Fox 2.6
Если условиям, указанным в Locate может удолвлетворять не более, чем 1 запись, то можно и запросом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Select ;
	Int(S.kgr/ 100000 ) As RG, ;
	S.kgr As kgr, ;
	S.KLIENT As KLIENT, ;
	S.NTR As NTR, ;
	SPACE( 49 ) As GR, ;
	S.Mod As Mod, ;
	S.KB As KOL, ;
	S.ZN As CEN, ;
	S.DATOT As DATOT, ;
	 0000000000 . 00  As SUME, ;
	S.NPR, ;
	S.NPD, ;
	 00  As Coll, ;
	P_SNCEN.Coll As TM ;
FROM ;
	T0404038 S, ;
	P_SNCEN ;
Into Table SNCEN.Dbf ;
WHERE ;
		P_SNCEN.NPR = S.NPR ;
	.And. P_SNCEN.NPD = S.NPD ;
	.And. P_SNCEN.DATD <= _DATK ;
	.And. P_SNCEN.Type = _Type ;
	.And. S.DATOT>=_DATN ;
	.And. S.DATOT<=_DATK ;
	.And. S.kop<> 3  ;
	.And. S.NPR> 0 

select SNCEN
replace FOR SEEK(str(SNCEN.Mod, 8 ),"t1082") Coll with t1082.nk



И еще, надеюсь, Вы в курсе, что для того, чтобы команда LOCATE работала быстрее необходимо преварительно отключить главный индекс в той рабочей области, где выполняется Locate

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
* Для ускорения последующих Locate при поиске в P_SNCEN
select P_SNCEN
SET ORDER TO  0 

_Npd= 0 
Sele SNCEN
Scan
	(...)
EndScan
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос Fox 2.6 / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]