sql >> Databáze >  >> RDS >> Sqlserver

Aktualizace 4 milionů záznamů na serveru SQL pomocí seznamu ID záznamů jako vstupu

Nejlepší způsob, jak přistoupit k tomuto požadavku, je vložit 4 miliony záznamů do tabulky. Ve skutečnosti je můžete vložit do tabulky se sloupcem identity „hromadným vložením“ do pohledu.

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

create view v_TheIds (select id from TheIds);

bulk insert into v_TheIds . . .

Se všemi údaji v databázi máte nyní mnohem více možností. Zkuste aktualizaci:

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

Měli byste také vytvořit index na TheIds(id) .

Toto je rozsáhlá aktualizace, vše se provádí jako jedna transakce. To může mít dopad na špatný výkon a začít vyplňovat protokol. Můžete jej rozdělit na menší transakce pomocí rownum sloupec:

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

Klauzule exists zde dělá ekvivalent left outer join . Hlavním rozdílem je, že tato korelovaná syntaxe poddotazu by měla fungovat v jiných databázích, kde jsou spojení s aktualizacemi specifická pro databázi.

Pomocí rownum můžete pro aktualizaci vybrat tolik řádků, kolik chcete. Pokud je tedy celková aktualizace příliš velká, můžete aktualizaci uvést do smyčky:

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

a tak dále. Nemusíte to dělat, ale můžete, pokud z nějakého důvodu chcete aktualizace dávkovat.

Klíčovou myšlenkou je dostat seznam id do tabulky v databázi, abyste mohli využít sílu databáze pro následné operace.



  1. Nelze spustit Insert and Select LAST_INSERT_ID() ve stejném dotazu?

  2. Jak mohu přidat cizí klíč při vytváření nové tabulky?

  3. Další #1054:Neznámý sloupec v záhadě 'seznamu polí'

  4. Jak dosáhnu toho, aby MySQL používala INDEX pro zobrazení dotazu?