Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Не могу оптимизировать Update  [new]
glamis
Member

Откуда:
Сообщений: 603
Не могу оптимизировать Update:

Select Kod, npp, Ediz, Mater, Kolvo, Cena, Summa, Debet, Kredit, Primec, Statya_kr;
	from Schet2;
	INTO CURSOR atmp;
	Where Kod+npp = _key readw
INDEX on kod+npp TAG kod

Update Sch2_MTC;
	SET Ediz=atmp.Ediz, Mater=atmp.Mater, Kolvo=atmp.Kolvo, Cena=atmp.Cena,;
		Summa=atmp.Summa, Debet=atmp.Debet, Kredit=atmp.Kredit, Primec=atmp.Primec, Statya_kr=atmp.Statya_kr;
	from atmp;
	where sch2_mtc.Kod+sch2_mtc.npp = atmp.kod+atmp.npp


Выборка дает 1 запись, Update работает очень долго - более часа recc('sch2_mtc') ~ 2000000.
Если написать:
...from atmp;
	where sch2_mtc.Kod+sch2_mtc.npp = _key

работает менее секунды. Но так можно только для случая 1 записи:)

sys(3054) выдает:
Update Sch2_MTC SET Ediz=atmp.Ediz, Mater=atmp.Mater, Kolvo=atmp.Kolvo, Cena=atmp.Cena, Summa=atmp.Summa, Debet=atmp.Debet, Kredit=atmp.Kredit, Primec=atmp.Primec, Statya_kr=atmp.Statya_kr from atmp where sch2_mtc.Kod+sch2_mtc.npp = atmp.kod+atmp.npp
Rushmore optimization level for intermediate result: none
Using index tag Delete to rushmore optimize table sch2_mtc
Rushmore optimization level for table sch2_mtc: full
Joining table sch2_mtc and intermediate result using index tag Kod


Sch2_mtc имеет индексы kod и kod+npp
Для atmp пробовал создавать индекс kod результат тот же.
28 авг 17, 13:47    [20753586]     Ответить | Цитировать Сообщить модератору
 Re: Не могу оптимизировать Update  [new]
Dima T
Member

Откуда:
Сообщений: 15294
Сделай индекс для Sch2_MTC
INDEX on kod+npp TAG kod_npp

или если уже есть индекс по kod или npp
where sch2_mtc.Kod = atmp.kod and sch2_mtc.npp = atmp.npp
28 авг 17, 14:03    [20753650]     Ответить | Цитировать Сообщить модератору
 Re: Не могу оптимизировать Update  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1547
glamis
INDEX on kod+npp TAG kod
После этого добавить
set order to
28 авг 17, 14:07    [20753663]     Ответить | Цитировать Сообщить модератору
 Re: Не могу оптимизировать Update  [new]
glamis
Member

Откуда:
Сообщений: 603
Dima T

Сделай индекс для Sch2_MTC
INDEX on kod+npp TAG kod_npp

Такой уже есть
или если уже есть индекс по kod или npp

И по kod есть
where sch2_mtc.Kod = atmp.kod and sch2_mtc.npp = atmp.npp

И это уже пробовал.

Не понимаю вот это:
Rushmore optimization level for intermediate result: none
28 авг 17, 14:37    [20753796]     Ответить | Цитировать Сообщить модератору
 Re: Не могу оптимизировать Update  [new]
Dima T
Member

Откуда:
Сообщений: 15294
как вариант попробовать where на join заменить, как у select.
	from atmp join Sch2_MTC on sch2_mtc.Kod+sch2_mtc.npp = atmp.kod+atmp.npp

Не проверял, может не заработает.

Еще попробуй индекс не делать для atmp, т.к. тут создается два варианта выбора индекса (по atmp и по Sch2_MTC) и фокс выбирает неправильный.
28 авг 17, 15:06    [20753919]     Ответить | Цитировать Сообщить модератору
 Re: Не могу оптимизировать Update  [new]
glamis
Member

Откуда:
Сообщений: 603
Dima T,
Update and Delete cannot outed join:)
28 авг 17, 15:14    [20753946]     Ответить | Цитировать Сообщить модератору
 Re: Не могу оптимизировать Update  [new]
Dima T
Member

Откуда:
Сообщений: 15294
glamis
Dima T,
Update and Delete cannot outed join:)

Возможно. Я update редко использую:
sele atmp
scan for IndexSeek(atmp.kod+atmp.npp, .T., 'Sch2_MTC', 'Kod_npp')
    if rlock('Sch2_MTC')
       repl in Sch2_MTC ...
       unlock in Sch2_MTC
   endif
endscan

Если ch2_mtc.Kod+sch2_mtc.npp неуникально, т.е. м.б. несколько записей, то добавить scan while
28 авг 17, 15:25    [20753995]     Ответить | Цитировать Сообщить модератору
 Re: Не могу оптимизировать Update  [new]
glamis
Member

Откуда:
Сообщений: 603
Dima T,
Хотел от Repl уйти:)
28 авг 17, 15:28    [20754008]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить