sql >> Database teknologi >  >> RDS >> Sqlserver

Opdatering af 4 millioner poster i SQL-server ved hjælp af liste over post-id'er som input

Den bedste måde at nærme sig denne forespørgsel på er ved at indsætte de 4 millioner poster i en tabel. Faktisk kan du placere dem i en tabel med en identitetskolonne ved at "masseindsætte" i en visning.

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

create view v_TheIds (select id from TheIds);

bulk insert into v_TheIds . . .

Med alle data i databasen har du nu mange flere muligheder. Prøv opdateringen:

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

Du bør også oprette et indeks på TheIds(id) .

Dette er en stor opdatering, der alle udføres som én transaktion. Det kan have dårlige præstationsimplikationer og begynde at fylde loggen. Du kan opdele det i mindre transaktioner ved at bruge rownum kolonne:

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

Exist-klausulen her svarer til left outer join . Den største forskel er, at denne korrelerede underforespørgselssyntaks burde fungere i andre databaser, hvor sammenføjninger med opdateringer er databasespecifikke.

Med rownum kolonne, kan du vælge så mange rækker, som du ønsker til opdateringen. Så du kan sætte opdateringen i en loop, hvis den samlede opdatering er for stor:

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

og så videre. Du behøver ikke at gøre dette, men det kan du, hvis du af en eller anden grund vil samle opdateringerne.

Nøgleideen er at få listen over id'er ind i en tabel i databasen, så du kan bruge databasens kraft til de efterfølgende operationer.



  1. Jeg bliver ved med at få fejlrelationen [TABEL] eksisterer ikke

  2. Optimeringstærskler – gruppering og aggregering af data, del 3

  3. Kontrollerer for datointervalkonflikter i MySQL

  4. 3 måder at erstatte NULL med "N/A" i SQLite