Wiem, że to stary post, ale myślę, że jest to bardzo ważny temat, szczególnie w dzisiejszych czasach, gdy mamy ponad 10 milionów rekordów i mówimy o terabajtach danych.
Zwrócę również uwagę na następujące spostrzeżenia. Mam około 45 milionów rekordów w mojej tabeli ([dane]) i około 300 rekordów w mojej tabeli [cats]. Mam obszerne indeksowanie dla wszystkich zapytań, o których będę mówić.
Rozważ przykład 1:
UPDATE d set category = c.categoryname
FROM [data] d
JOIN [cats] c on c.id = d.catid
w porównaniu z przykładem 2:
UPDATE d set category = (SELECT TOP(1) c.categoryname FROM [cats] c where c.id = d.catid)
FROM [data] d
Przykład 1 trwał około 23 minut. Przykład 2 zajął około 5 minut.
Więc doszedłbym do wniosku, że pod-zapytanie w tym przypadku jest znacznie szybsze. Oczywiście pamiętaj, że używam dysków SSD M.2 obsługujących I / O przy 1 GB / s (to bajty, a nie bity), więc moje indeksy też są naprawdę szybkie. Więc może to wpłynąć również na prędkość w twoich okolicznościach
Jeśli jest to jednorazowe czyszczenie danych, prawdopodobnie najlepiej zostawić je i zakończyć. Używam TOP (10000) i widzę, ile czasu to zajmuje, i mnożę przez liczbę rekordów, zanim trafię na duże zapytanie.
Jeśli optymalizujesz produkcyjne bazy danych, zdecydowanie sugerowałbym wstępne przetwarzanie danych, tj. Użycie wyzwalaczy lub pośrednika zadań do asynchronicznej aktualizacji rekordów, aby dostęp w czasie rzeczywistym pobierał dane statyczne.