-
Таблица проектируемой БД будет содержать несколько миллионов записей. Поле NPP - первичный ключ. Необходимо присвоить полю SELECTED значение 'T' для некоторых записей. Количество этих записей может меняться от 1 до всех записей в таблице. Перечень NPP записей, для которых необходимо выполнить присваивание, хранится в массиве. Предполагаю программно строить запрос вида:
update listprv set SELECTED='T' where npp in (1,5,25,...)
где в скобках будет список всех значений поля NPP изменяемых записей. Вопрос: насколько такой запрос будет эффективен? Выполнится ли он вообще ? Кстати-программа интерактивная, и если запрос будет выполняться несколько митут, то пользователь заскучает.
-
> [0] kudatsky (06.04.10 11:15) > Выполнится ли он вообще ?
Для нескольких записей выполнится, для большого количества нет. Есть ограничение на длину запроса. Можно записи помещать в специальную таблицу и джойнить с основной.
-
Проще все ключи, для которых надо сделать апдэйт, поместить во временную таблицу, запрос же реализовтаь простой связкой
-
>MsGuns Если можно, популярнее ...
-
> kudatsky (06.04.2010 11:15:00) [0]
Очень неэффективно.
-
Если я правильно понял MsGuns, нужно создать таблицу TEMP с единственным полем NPP, поместить туда все значения NPP и выпонить такой оператор
update listprv set SELECTED='T' where listprv.npp=temp.npp
-
Правильно понял
-
update listprv set SELECTED='T' where npp in (1,5,25,...)
Запрос такого вида будет распарсен оптимизатором в update listprv set SELECTED='T' where ((npp =1) or (npp =5) or (...)) Гораздо эффективнее по скорости будет:
EXECUTE BLOCK(
Q_NNP_IDS BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET WIN1251 = ?NNP_IDS
)AS
BEGIN
UPDATE LISTPRV L SET
L.SELECTED = 'T'
WHERE (:Q_NNP_IDS CONTAINING '~'||L.ID||'~');
END
При этом список ID передается в виде строки: '~1~5~10~12~...~156~'
-
> Проще все ключи, для которых надо сделать апдэйт, поместить > во временную таблицу
а что, в FB появились временные таблицы?
-
конечно!
-
эх, вот что значит застрять на полторушке... кста, автор версию-то не указал
-
Оптимизировать
> where npp in (1,5,25,...)
or (in > 50) and (in < 1000) и тд
-
> Правильный$Вася (08.04.10 18:15) [10] > > эх, вот что значит застрять на полторушке... > кста, автор версию-то не указал
Еще и CTE появились..триггеры на БД... а в 2,5 - регулярные выражения для поиска.. и многое другое
-
> Правильный$Вася (08.04.2010 18:15:10) [10]
А ему это неинтересно и так должно пойти.
|