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

UPDATE lub MERGE bardzo dużych tabel w SQL Server

Właściwie znalazłem ogólne zalecenia dla takich zapytań:Pomysł na użycie SQL Merge lub Update jest bardzo sprytny, ale nie udaje się, gdy potrzebujemy zaktualizować wiele rekordów (np. 75M ) w dużym i szerokim stole (tj. 240M ).

Patrząc na plan zapytania poniżej, możemy powiedzieć, że TABLE SCAN TABLE1 i końcowe MERGE zajmują 90% czasu.

MERGE TABLE1 as Target  
USING UTABLE as source  
ON Target.record_id = source.record_id   
WHEN MATCHED AND (condition) THEN   
    UPDATE SET Target.columns=source.columns

Aby więc użyć MERGE, musimy:

  1. Zmniejsz liczbę wierszy, które musimy zaktualizować i poprawnie przekaż te informacje do SQL Server. Można to zrobić, tworząc UTABLE mniejszy lub określając dodatkowy condition która zawęża część, która ma zostać scalona.
  2. Upewnij się, że część, która ma zostać scalona, ​​mieści się w pamięci, w przeciwnym razie zapytanie działa znacznie wolniej. Tworzenie TABLE1 dwa razy mniej skróciło mój rzeczywisty czas zapytania z 11 godzin do 40 minut.

Jak wspomniał Mark, możesz użyć UPDATE składnia i użyj WHERE klauzula o zawężeniu części, która ma zostać scalona - da to takie same wyniki. Unikaj również indeksowania TABLE1 ponieważ spowoduje to dodatkową pracę przy przebudowie indeksu podczas MERGE



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przekazywanie wartości varchar pełnej wartości oddzielonych przecinkami do funkcji SQL Server IN

  2. SQL Server:Nieprawidłowa nazwa kolumny

  3. Maksymalny rozmiar zapytania SQL Server? Klauzula IN? Czy istnieje lepsze podejście?

  4. Jak przechowywać rekordy historyczne w tabeli historii w SQL Server

  5. Zwróć listę tabel i widoków w SQL Server przy użyciu T-SQL (sp_tables)