SQL (плюс) производительность с последовательностью - PullRequest
1 голос
/ 14 октября 2010

Я должен сгенерировать несколько миллионов обновлений из какой-то таблицы, чтобы обновить себя. Я только недавно узнал о parallel(tablename,threads), который действительно улучшил производительность в PLSQL-разработчике, когда я запустил что-то вроде этого:

select /* + parallel(table1,100) parallel(table2,100) */
       'update table1 set id = 1 where ... and id = '||table1.id||' ...
where ...

(Я делаю это так, потому что в обновлении мне выдаются резервные данные. И мой БОСС сказал мне сделать это так; -))

Так что это действительно работает быстро при использовании статического числа в части set id = 1 и в PLSQL Developer.

Но затем я записал его в файл, вставил create sequence и попытался использовать следующую последовательность:

create sequence myseq
 start with   4200000
 increment by 1
 maxvalue     11200000;


select /* + parallel(table1,100) parallel(table2,100) */
       'update table1 set id = '||myseq.nextval||' where ... and id = '||table1.id||' ...
where ...

Но теперь это ужасно медленно. И я не знаю почему. Я просто переписал генератор update, чтобы вставить туда статические данные, и использовал awk, чтобы заменить это последовательностью чисел, но кто-нибудь может объяснить, что вызвало это (и могу ли я что-то с этим сделать)? *

Заранее спасибо!

1 Ответ

8 голосов
/ 14 октября 2010

Последовательности могут быть узким местом, особенно когда их используют несколько сессий / потоков одновременно.

Главное, что вы можете сделать, чтобы улучшить это, - это увеличить количество кэшируемых значений последовательности: ALTER SEQUENCE CACHE n, заменив n на значение больше 20 (по умолчанию). Я бы предложил установить его намного выше, поскольку вы будете использовать многие или все значения последовательности в одном выражении. Вы можете подняться до (CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...