sql >> Database >  >> RDS >> Sqlserver

Bijwerken van 4 miljoen records in SQL-server met lijst van record-id's als invoer

De beste manier om deze vraag te benaderen is door de 4 miljoen records in een tabel in te voegen. U kunt ze zelfs in een tabel met een identiteitskolom plaatsen door "bulk invoegen" in een weergave.

create table TheIds (rownum int identity(1,1), id int);

create view v_TheIds (select id from TheIds);

bulk insert into v_TheIds . . .

Met alle gegevens in de database heb je nu veel meer mogelijkheden. Probeer de update:

update t
    set booleanfield = 1
    where exists (select 1 from TheIds where TheIds.id = t.id)

U moet ook een index maken op TheIds(id) .

Dit is een grote update, die allemaal als één transactie wordt uitgevoerd. Dat kan nadelige gevolgen hebben voor de prestaties en het logboek beginnen te vullen. U kunt het opsplitsen in kleinere transacties met behulp van het rownum kolom:

update t
    set booleanfield = 1
    where exists (select 1 from TheIds where TheIds.id = t.id and TheIds.rownum < 1000)

De bestaande clausule hier doet het equivalent van de left outer join . Het grote verschil is dat deze gecorreleerde syntaxis voor subquery's zou moeten werken in andere databases, waar joins met updates databasespecifiek zijn.

Met het rownum kolom, kunt u zoveel rijen selecteren als u wilt voor de update. U kunt de update dus in een lus plaatsen als de algehele update te groot is:

where rownum < 100000
where rownum between 100000 and 199999
where rownum between 200000 and 299999

enzovoort. U hoeft dit niet te doen, maar u kunt dit wel doen als u de updates om de een of andere reden wilt batchen.

Het belangrijkste idee is om de lijst met id's in een tabel in de database te krijgen, zodat u de kracht van de database kunt gebruiken voor de volgende bewerkingen.



  1. MySQL - Waarde van 1 in DECIMAL (2, 2) komt uit als 0,99

  2. Een cel markeren PHP een bepaalde kleur op basis van MYSQL-waarde

  3. het automatiseren van rollback script oracle

  4. hoe Implementeer de asp.net-toepassing op Windows Azure..?