Mam problemy z wydajnością SQL. W nagłym przypadku następujące zapytania są bardzo powolne:Bardzo powolne zapytanie DELETE
Mam dwie listy zawierające identyfikatory pewnej tabeli. Muszę usunąć wszystkie rekordy z pierwszej listy, jeśli już istnieje Id w drugim liście:
DECLARE @IdList1 TABLE(Id INT)
DECLARE @IdList2 TABLE(Id INT)
-- Approach 1
DELETE list1
FROM @IdList1 list1
INNER JOIN @IdList2 list2 ON list1.Id = list2.Id
-- Approach 2
DELETE FROM @IdList1
WHERE Id IN (SELECT Id FROM @IdList2)
Jest możliwe, że dwie listy zawiera ponad 10.000 rekordów. W takim przypadku oba zapytania trwają dłużej niż 20 sekund.
Plan wykonania pokazał także coś, czego nie rozumiem. Może to wyjaśnia, dlaczego jest tak powolny:
I Wypełniłem obie listy z 10.000 kolejnych liczb całkowitych, więc obie listy zawierały wartość 1-10.000 jako punkt początkowy.
Jak widać oba zapytania są wyświetlane dla @ IdList2 Rzeczywista liczba wierszy wynosi 50.005.000 !!. @ IdList1 jest poprawny (Rzeczywista liczba wierszy jest 10.000)
Wiem, że istnieją inne rozwiązania, jak rozwiązać ten problem. Tak jak w przypadku wypełniania trzeciej listy usuniętej z pierwszej listy. Ale moje pytanie brzmi:
Dlaczego są one tak powolne i dlaczego widzę te dziwne plany zapytań?
Czy jest to problem, który można napotkać w realnym scenariuszu lub tylko w tej specilizowanej sytuacji? – Jodrell
@Jodrell - Podstawowe problemy związane z brakiem statystyk rekompilacji zmiennych tabel (i brak przydatnych indeksów na nich) są bardzo powszechne. –