sql >> Databasteknik >  >> RDS >> Sqlserver

Uppdaterar 4 miljoner poster i SQL-servern med hjälp av en lista med post-id som indata

Det bästa sättet att närma sig denna fråga är genom att infoga de 4 miljoner posterna i en tabell. Faktum är att du kan lägga in dem i en tabell med en identitetskolumn genom att "bulka infoga" i en vy.

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

create view v_TheIds (select id from TheIds);

bulk insert into v_TheIds . . .

Med all data i databasen har du nu många fler alternativ. Testa uppdateringen:

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

Du bör också skapa ett index på TheIds(id) .

Det här är en stor uppdatering, alla utförs som en transaktion. Det kan få dåliga prestandaimplikationer och börja fylla loggen. Du kan dela upp det i mindre transaktioner med rownum kolumn:

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

Exist-satsen här gör motsvarande left outer join . Den stora skillnaden är att den här korrelerade underfrågesyntaxen bör fungera i andra databaser, där kopplingar med uppdateringar är databasspecifika.

Med rownum kolumn kan du välja så många rader du vill för uppdateringen. Så du kan lägga uppdateringen i en loop, om den övergripande uppdateringen är för stor:

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

och så vidare. Du behöver inte göra detta, men du kan göra det om du vill batcha uppdateringarna av någon anledning.

Nyckelidén är att få in listan med ID i en tabell i databasen, så att du kan använda kraften i databasen för de efterföljande operationerna.



  1. Välj kolumner med särskilda kolumnnamn i PostgreSQL

  2. Hur man använder MATCH i Symfony2 Database Query

  3. Postgresql:Kontrollera om Schema existerar?

  4. Care To Know-klausuler:Allt om SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY och LIMIT