:: Visual Foxpro, Foxpro for DOS
Быстрый UPDATE
lili

Сообщений: 432
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
Приветствую всех!
Есть очень большая таблица в базе на СКЛ-сервере. Нужно выполнить на ней запрос вида:
UDPATE MY_TABLE set P1=?m.P1 where P2=?m.P2 and P3<?m.P3
У таблицы есть ключ по P2,P3. Но его ведь не вставишь в UPDATE.
Как ускорить выполнение запроса?
Ratings: 0 negative/0 positive
Re: Быстрый UPDATE
ssa
Автор

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
lili
Приветствую всех!
Есть очень большая таблица в базе на СКЛ-сервере. Нужно выполнить на ней запрос вида:
UDPATE MY_TABLE set P1=?m.P1 where P2=?m.P2 and P3<?m.P3
У таблицы есть ключ по P2,P3. Но его ведь не вставишь в UPDATE.
Что значит "вставить ключ в апдейт"? Зачем его вставлять? С чего взяли, что надо что-то куда-то вставлять?
Цитата:
Как ускорить выполнение запроса?
Иметь соответствующий этому запросу индекс. Наличие индекса по P1,P2 вроде вполне подходящее. Проверить это можно по плану запроса. Если таки индекс не используется, то надо создать нужный индекс.

------------------
Лень - это неосознанная мудрость.




Исправлено 2 раз(а). Последнее : ssa, 07.12.18 17:07
Ratings: 0 negative/0 positive
Re: Быстрый UPDATE
ry

Сообщений: 2113
Дата регистрации: 24.09.2007
Раз возник такой вопрос, то дело явно в медленном выполнении обновления. Что в общем случае надо уточнять и проверять:
Обновление выполняется по сети или локально?
Какая разница по времени при локальном и сетевом выполнении запроса?
Обновление происходит при монопольном или при совместном доступе?
Не мешает ли антивирус?
Индексы оптимизируемые или нет?
Кстати, "очень большая таблица" - это сколько записей и полей?
Ratings: 0 negative/0 positive
Re: Быстрый UPDATE
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Посмотреть заодно нет ли каких триггеров на эту таблицу - может они медленно работают при этой операции. А так - да, индекс по P2,P3 должен ускорять такой запрос. Правда если таблица "очень большая", то вполне возможно что под указанное условие тоже попадает "очень много записей", и наблюдаемая скорость вполне адекватна для такого объёма работы.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Быстрый UPDATE
lili

Сообщений: 432
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
Таких команд нужно выполнить несколько тысяч в процедуре по заданному списку.
Очень быстро получилось через курсор-адаптер, типа того:
m.p2=0
m.p3=0
** Определяю курсор (ind1 - индекс по P2, P3)
Crs_MyCrs=CREATEOBJECT('CursorAdapter')
WITH Crs_MyCrs
.alias="MY_TABLE"
.DataSourceType="ODBC"
.DataSource=lnConnect
.SelectCmd="select ID, P1, P2, P3 from MY_TABLE with (nolock index=ind1) where P2=?m.p2 and P3<?m.p3"
.CursorSchema="ID int, P1 int, P2 int, P3 int"
.KeyFieldList="ID"
.tables="MY_TABLE"
.UpdatableFieldList="P1"
.UpdateNameList="P1 MY_TABLE.P1
.FetchSize=-1
IF .cursorFill(.t.)=.f.
=AERROR(laError)
MESSAGEBOX(laError(2))
RETURN .f.
ENDIF
ENDWITH
** создаю цикл по нужным значениям
do while ...
m.p1=...
m.p2=...
m.p3=...
select MY_TABLE
requery()
replace all P1 with m.p1
=tableupdate(1)
enddo
Ratings: 0 negative/0 positive
Re: Быстрый UPDATE
ssa
Автор

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
lili
Таких команд нужно выполнить несколько тысяч в процедуре по заданному списку.
А зачем плодить столько команд? Чтоб помедленннее было за счет диких накладных расходов на генерацию, передачу на сервеа, компиляцию и т.д. самих запросов?
Цитата:
Очень быстро получилось через курсор-адаптер, типа того:
.KeyFieldList="ID"
lili
UDPATE MY_TABLE set P1=?m.P1 where P2=?m.P2 and P3<?m.P3
Ничто не смущает?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 25 (Гостей: 25)

© 2000-2024 Fox Club 
Яндекс.Метрика