Форум: "Базы";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];
ВнизОцените эффективность запроса в FireBird Найти похожие ветки
← →
kudatsky (2010-04-06 11:15) [0]Таблица проектируемой БД будет содержать несколько миллионов записей. Поле NPP - первичный ключ. Необходимо присвоить полю SELECTED значение "T" для некоторых записей. Количество этих записей может меняться от 1 до всех записей в таблице. Перечень NPP записей, для которых необходимо выполнить присваивание, хранится в массиве. Предполагаю программно строить запрос вида:
update listprv set SELECTED="T" where npp in (1,5,25,...)
где в скобках будет список всех значений поля NPP изменяемых записей.
Вопрос: насколько такой запрос будет эффективен? Выполнится ли он вообще ? Кстати-программа интерактивная, и если запрос будет выполняться несколько митут, то пользователь заскучает.
← →
Sergey13 © (2010-04-06 11:19) [1]> [0] kudatsky (06.04.10 11:15)
> Выполнится ли он вообще ?
Для нескольких записей выполнится, для большого количества нет. Есть ограничение на длину запроса.
Можно записи помещать в специальную таблицу и джойнить с основной.
← →
MsGuns © (2010-04-06 11:21) [2]Проще все ключи, для которых надо сделать апдэйт, поместить во временную таблицу, запрос же реализовтаь простой связкой
← →
kudatsky (2010-04-06 11:25) [3]>MsGuns
Если можно, популярнее ...
← →
Anatoly Podgoretsky © (2010-04-06 11:44) [4]> kudatsky (06.04.2010 11:15:00) [0]
Очень неэффективно.
← →
kudatsky (2010-04-06 12:12) [5]Если я правильно понял MsGuns, нужно создать таблицу TEMP с единственным полем NPP, поместить туда все значения NPP и выпонить такой оператор
update listprv set SELECTED="T" where listprv.npp=temp.npp
← →
MsGuns © (2010-04-07 10:44) [6]Правильно понял
← →
PEAKTOP © (2010-04-07 11:55) [7]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~"
← →
Правильный$Вася (2010-04-08 17:41) [8]
> Проще все ключи, для которых надо сделать апдэйт, поместить
> во временную таблицу
а что, в FB появились временные таблицы?
← →
Виталий Панасенко(дом) (2010-04-08 17:45) [9]конечно!
← →
Правильный$Вася (2010-04-08 18:15) [10]эх, вот что значит застрять на полторушке...
кста, автор версию-то не указал
← →
Jeer © (2010-04-08 18:17) [11]Оптимизировать
> where npp in (1,5,25,...)
or (in > 50) and (in < 1000)
и тд
← →
Виталий Панасенко(дом) (2010-04-08 19:39) [12]
> Правильный$Вася (08.04.10 18:15) [10]
>
> эх, вот что значит застрять на полторушке...
> кста, автор версию-то не указал
Еще и CTE появились..триггеры на БД... а в 2,5 - регулярные выражения для поиска.. и многое другое
← →
Anatoly Podgoretsky © (2010-04-08 19:47) [13]> Правильный$Вася (08.04.2010 18:15:10) [10]
А ему это неинтересно и так должно пойти.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c