Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Aktualizacja 4 milionów rekordów na serwerze SQL przy użyciu listy identyfikatorów rekordów jako danych wejściowych

Najlepszym sposobem rozwiązania tego pytania jest wstawienie 4 milionów rekordów do tabeli. W rzeczywistości możesz umieścić je w tabeli z kolumną tożsamości, „wstawiając zbiorczo” do widoku.

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

create view v_TheIds (select id from TheIds);

bulk insert into v_TheIds . . .

Mając wszystkie dane w bazie danych, masz teraz o wiele więcej opcji. Wypróbuj aktualizację:

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

Powinieneś także utworzyć indeks na TheIds(id) .

Jest to duża aktualizacja, wszystkie wykonywane jako jedna transakcja. Może to mieć zły wpływ na wydajność i zacząć zapełniać dziennik. Możesz podzielić go na mniejsze transakcje za pomocą rownum kolumna:

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

Klauzula exist tutaj wykonuje odpowiednik left outer join . Główną różnicą jest to, że ta skorelowana składnia podzapytania powinna działać w innych bazach danych, gdzie łączenia z aktualizacjami są specyficzne dla bazy danych.

Z rownum kolumna, możesz wybrać dowolną liczbę wierszy do aktualizacji. Możesz więc umieścić aktualizację w pętli, jeśli ogólna aktualizacja jest zbyt duża:

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

i tak dalej. Nie musisz tego robić, ale możesz, jeśli z jakiegoś powodu chcesz grupować aktualizacje.

Kluczową ideą jest umieszczenie listy identyfikatorów w tabeli w bazie danych, dzięki czemu można wykorzystać moc bazy danych do kolejnych operacji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Obliczanie wieczystego średniego ważonego kosztu SQL Server 2008

  2. Podczas próby uzyskania dostępu do serwera SQL Server 2008 w mojej domenie otrzymuję błąd, że serwer nie został znaleziony lub był niedostępny

  3. Jaka jest różnica między kluczem podstawowym a kluczem zastępczym?

  4. Jak mogę przekonwertować funkcję split na inline table o wartości udf w serwerze SQL?

  5. jak uzyskać rok i dzień w roku za pomocą serwera sql