Mamy ogromną bazę danych produkcji, jej rozmiar to około 300 GB. Czy istnieje jakieś podejście do poprawy wydajności zapytania usuwającego? W tej chwili szybkość usuwania wynosi od 1 do 10 000 na minutę, jest dla nas bardzo wolna.
sql-server
query-performance
Społeczność
źródło
źródło
Odpowiedzi:
Jeśli próbujesz usunąć dużą liczbę wierszy w pojedynczej instrukcji, prawdopodobnie czekasz na aktywność dziennika. Więc możesz:
TRUNCATE
lubDROP
/CREATE
.SELECT INTO
aby umieścić dane, które chcesz zachować, w innej tabeli, aTRUNCATE
następnie przenieś małą część z powrotem. (Lub po prostu upuść starą tabelę, zmień nazwę nowej i ponownie zastosuj ograniczenia / uprawnienia itp.)CHECKPOINT
wyczyścić dziennik zamiast wykonywać kopie zapasowe dziennika, ale musisz pamiętać o jego ponownym ustawieniu i wzięciu nowej pełnej kopii zapasowej, aby ponownie zainicjować łańcuch dziennika .źródło
Jest jakaś wskazówka, ale jakiej wersji używasz? Czy to jest wersja Enterprise? Tak czy inaczej:
Dodaj szczegóły, gdy pracujesz z dużą bazą danych, nie ma jednej poprawnej odpowiedzi.
źródło
Powinieneś spróbować usunąć je fragment po kawałku, prawdopodobnie usuwając w pętli, każda iteracja usuwania własnej transakcji, a następnie czyszczenie dziennika na końcu każdej iteracji pętli.
Ponadto musisz znaleźć liczbę, która będzie używana jako wartość w porcji do usuwania rekordów. Wymaga to dokładnych testów, lepiej byłoby najpierw przetestować wartość porcji w UAT.
Aby dowiedzieć się, jak postępować, zapoznaj się z rozdziałem Podziel duże operacje usuwania na części
źródło
usuwanie może być powolne, jeśli duża tabela ma rekurencyjny klucz obcy.
jeśli tak, znajdź odpowiedni czas, wyłącz usługi zależne, wyłącz rekurencyjny klucz obcy, wykonaj masowe usuwanie, a następnie przywróć klucz obcy ponownie.
źródło
Dodanie kilku dodatkowych punktów ...
tablock
opcji.Aby uzyskać więcej pomocy, opublikuj zapytanie, którego używasz, informacje o tabeli oraz wszelkie informacje o blokowaniu.
źródło