Wiem, że INSERT w tabeli SQL może być powolny z wielu powodów:
- Istnienie INSERT TRIGGERs na stole
- Wiele wymuszonych ograniczeń, które należy sprawdzić (zwykle klucze obce)
- Strona dzieli się w indeks klastrowany, gdy wiersz jest wstawiany na środku tabeli
- Aktualizowanie wszystkich powiązanych indeksów nieklastrowych
- Blokowanie innych działań na stole
- Zły czas odpowiedzi zapisu we / wy
- ... coś mi umknęło?
Jak mogę określić, która jednostka jest odpowiedzialna w konkretnym przypadku? Jak mogę zmierzyć wpływ podziału strony na aktualizacje indeksów nieklastrowanych i wszystko inne?
Mam zapisany proc, który wstawia około 10 000 wierszy na raz (z tabeli tymczasowej), co zajmuje około 90 sekund na 10 000 wierszy. Jest to niedopuszczalnie wolne, ponieważ powoduje przekroczenie limitu czasu przez inne pająki.
Przejrzałem plan wykonania i widzę zadanie INSERT CLUSTERED INDEX oraz wszystkie INDEX SEEKS z wyszukiwania FK, ale wciąż nie mówi mi to na pewno, dlaczego trwa to tak długo. Brak wyzwalaczy, ale tabela zawiera garść kluczy FKeys (które wydają się być poprawnie zindeksowane).
To jest baza danych SQL 2000.
Odpowiedzi:
Niektóre rzeczy, na które możesz spojrzeć ...
Zmniejsz rozmiar partii ze 10000 do czegoś mniejszego, na przykład 2000 lub 1000 (nie powiedziałeś, jak duży jest twój rozmiar wiersza).
Spróbuj włączyć statystyki IO, aby zobaczyć, ile IO zajmuje wyszukiwanie FK.
Jakie jest oczekiwanie spowodowane przez wstawianie go (master.dbo.sysprocesses)?
Zacznijmy tutaj i zobaczmy, dokąd zmierzamy.
źródło
Ćwiek,
Powinieneś sprawdzić statystyki oczekiwania dla twojego zapytania. Za pomocą SQL2000 można użyć składni DBCC SQLPERF („waitstats”), aby uzyskać te szczegóły.
źródło
Potrafię powiedzieć, czego szukam, analizując wydajność zapytania. Może to pomaga.
źródło
Spróbuj użyć:
i
STATYSTYKA IO
PROFIL STATYSTYCZNY
źródło