Конференция "Базы" » Оцените эффективность запроса в FireBird
 
  • kudatsky (06.04.10 11:15) [0]
    Таблица проектируемой БД будет содержать несколько миллионов записей. Поле NPP - первичный ключ. Необходимо присвоить полю SELECTED значение 'T' для некоторых записей. Количество этих записей может меняться от 1 до всех записей в таблице. Перечень NPP записей, для которых необходимо выполнить присваивание, хранится в массиве. Предполагаю программно строить запрос вида:

    update listprv set SELECTED='T' where npp in (1,5,25,...)

    где в скобках будет список всех значений поля NPP изменяемых записей.
    Вопрос: насколько такой запрос будет эффективен? Выполнится ли он вообще ? Кстати-программа интерактивная, и если запрос будет выполняться несколько митут, то пользователь заскучает.
  • Sergey13 © (06.04.10 11:19) [1]
    > [0] kudatsky   (06.04.10 11:15)
    > Выполнится ли он вообще ?

    Для нескольких записей выполнится, для большого количества нет. Есть ограничение на длину запроса.
    Можно записи помещать в специальную таблицу и джойнить с основной.
  • MsGuns © (06.04.10 11:21) [2]
    Проще все ключи, для которых надо сделать апдэйт, поместить во временную таблицу, запрос же реализовтаь простой связкой
  • kudatsky (06.04.10 11:25) [3]
    >MsGuns
    Если можно, популярнее ...
  • Anatoly Podgoretsky © (06.04.10 11:44) [4]
    > kudatsky  (06.04.2010 11:15:00)  [0]

    Очень неэффективно.
  • kudatsky (06.04.10 12:12) [5]
    Если я правильно понял MsGuns, нужно создать таблицу TEMP с единственным полем NPP, поместить туда все значения NPP и выпонить такой оператор

    update listprv set SELECTED='T' where listprv.npp=temp.npp
  • MsGuns © (07.04.10 10:44) [6]
    Правильно понял
  • PEAKTOP © (07.04.10 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~'
  • Правильный$Вася (08.04.10 17:41) [8]

    > Проще все ключи, для которых надо сделать апдэйт, поместить
    > во временную таблицу

    а что, в FB появились временные таблицы?
  • Виталий Панасенко(дом) (08.04.10 17:45) [9]
    конечно!
  • Правильный$Вася (08.04.10 18:15) [10]
    эх, вот что значит застрять на полторушке...
    кста, автор версию-то не указал
  • Jeer © (08.04.10 18:17) [11]
    Оптимизировать


    > where npp in (1,5,25,...)

    or (in > 50) and  (in < 1000)
    и тд
  • Виталий Панасенко(дом) (08.04.10 19:39) [12]

    > Правильный$Вася   (08.04.10 18:15) [10]
    >
    > эх, вот что значит застрять на полторушке...
    > кста, автор версию-то не указал

    Еще  и CTE появились..триггеры на БД... а в 2,5 - регулярные выражения для поиска.. и многое другое
  • Anatoly Podgoretsky © (08.04.10 19:47) [13]
    > Правильный$Вася  (08.04.2010 18:15:10)  [10]

    А ему это неинтересно и так должно пойти.
 
Конференция "Базы" » Оцените эффективность запроса в FireBird
Есть новые Нет новых   [134433   +22][b:0][p:0.001]