Обновление идентификатора в хранимой процедуре - огромное количество выборок

UPDATE TABLE SET SOMETHING = 1 WHERE ID IN (SELECT ID FROM STORED_PROCEDURE)

Записей в ТАБЛИЦЕ = 2100

Записи из хранимой процедуры = 50

Это утверждение связано с огромным количеством выборок (31M!) на сервере Firebird 2.5. Почему? Разве он не должен сначала выбрать идентификатор из хранимой процедуры, а затем поместить его в предложение where? Что я должен сделать, чтобы заставить его работать?


person JustMe    schedule 20.04.2011    source источник
comment
@JustMe: STORED_PROCEDURE - это таблица или функция, и если последнее, то что делает процедура с точки зрения доступа к базе данных?   -  person Bob Jarvis - Reinstate Monica    schedule 20.04.2011
comment
@Bob Это выбираемая хранимая процедура - одна для выбора с приостановкой   -  person JustMe    schedule 20.04.2011
comment
@JustMe: Хорошо, а что делает хранимая процедура с точки зрения доступа к базе данных?   -  person Bob Jarvis - Reinstate Monica    schedule 20.04.2011
comment
@Bob Он выбирает строки из базы данных (выбирает из таблицы) - работает с той же таблицей, что и UPDATE.   -  person JustMe    schedule 20.04.2011
comment
@Bob Просто попробуйте сделать SELECT ... WHERE ID IN (STORED_PROCEDURE) - вы увидите проблему. Он извлекает хранимую процедуру для всех записей в таблице выбора, а затем вырезает ее в предложении where.   -  person JustMe    schedule 20.04.2011
comment
@JustMe: Не могли бы вы отредактировать свой пост, чтобы включить код в хранимую процедуру?   -  person Bob Jarvis - Reinstate Monica    schedule 25.04.2011
comment
Я понимаю, что хранимая процедура применяет некоторые фильтры к таблице, чтобы ограничить вывод, поэтому вы используете эти фильтры косвенно, используя условие WHERE ID IN (SELECT ID FROM STORED_PROCEDURE). Но изменится ли производительность, если вы пропустите хранимую процедуру и примените фильтры напрямую?   -  person Andriy M    schedule 29.04.2011
comment
@Andiry Хранимая процедура была создана для получения фильтра, поэтому я не могу ее пропустить. Проблема в том, что хранимая процедура вызывается для каждой записи в таблице UPDATE. Ссылаясь на эту статью: firebirdfaq.org/faq143 хорошая идея - присоединиться к левой стороне, но я не могу в предложении UPDATE:/   -  person JustMe    schedule 30.04.2011


Ответы (1)


Попробуйте что-то вроде этого:

declare variable myid integer;    
begin
    for
        select id from stored_procedure into :myID
    do begin
      update table set something = 1 where table.id = :myID;
    end
end
person Attila Szasz    schedule 24.05.2011