Най-добрият начин да подходите към това запитване е като вмъкнете 4 милиона записа в таблица. Всъщност можете да ги поставите в таблица с колона за самоличност чрез „групово вмъкване“ в изглед.
create table TheIds (rownum int identity(1,1), id int);
create view v_TheIds (select id from TheIds);
bulk insert into v_TheIds . . .
С всички данни в базата данни сега имате много повече възможности. Опитайте актуализацията:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id)
Трябва също така да създадете индекс на TheIds(id)
.
Това е голяма актуализация, която се изпълнява като една транзакция. Това може да има лошо въздействие върху производителността и да започне да запълва регистрационния файл. Можете да го разделите на по-малки транзакции, като използвате rownum
колона:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id and TheIds.rownum < 1000)
Клаузата за съществуване тук прави еквивалента на left outer join
. Основната разлика е, че този синтаксис на корелирана подзаявка трябва да работи в други бази данни, където присъединяванията с актуализации са специфични за базата данни.
С rownum
можете да изберете толкова редове, колкото желаете за актуализацията. Така че можете да поставите актуализацията в цикъл, ако цялостната актуализация е твърде голяма:
where rownum < 100000
where rownum between 100000 and 199999
where rownum between 200000 and 299999
и така нататък. Не е нужно да правите това, но можете, ако искате да групирате актуализациите по някаква причина.
Основната идея е да получите списъка с идентификатори в таблица в базата данни, така че да можете да използвате силата на базата данни за следващите операции.