ХП селектит таблицу и одновременно инсертит в нее. проблема

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Spa_2002
Сообщения: 28
Зарегистрирован: 13 май 2005, 15:47

ХП селектит таблицу и одновременно инсертит в нее. проблема

Сообщение Spa_2002 » 06 май 2006, 09:38

День добрый всем!

Упрощенно задача такова:

нужно в таблицу вставлять записи , копирующие имеющиеся , но с изменением некоторых полей. Причем подлежат копированию записи , для которых измененных еще не существует .
пишем SP

/* выбираем записи по вышеописанным условиям*/
for select ... from table1 where .... and not exists(select .. from table1 where ...) into .... получаем (ключевые поля записи)
do
begin
insert into table1 ...
end

ПРОБЛЕМА:такое ощущение что после первого инсерта в теле цикла выборка изменяется !!! и часть записей оказывются не скопированными.
По моему разумению выборка должна быть статичной в течение всего цикла.Все-таки запрос каждый раз перевыполняется или нет ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 06 май 2006, 10:15

разумение тебя подвело. for select неатомарен. запрос не перевыполняется, просто он видит изменения, которые делаются в begin/end.
чтобы не видел, запрос, к примеру, должен иметь PLAN SORT. Добавь какой-нибудь ORDER BY, чтобы без индекса было.

Spa_2002
Сообщения: 28
Зарегистрирован: 13 май 2005, 15:47

Сообщение Spa_2002 » 06 май 2006, 10:35

Не совсем понял как Order By влияет на всевидящее око запроса , но после добавления сортировки все работает как задумано.
Спасибо, kdv!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 07 май 2006, 09:56

Order By влияет на всевидящее око запроса
не order by, а plan sort. записи сначала сортируются, а потом по ним идет перебор. В первоначальном варианте у тебя шел сразу перебор записей, куда ты добавлял данные. Сервер не гарантирует, что будет записывать данные всегда "в конец" таблицы. данные пишутся на свободное место.

Ответить