Jak mogę powiedzieć DLACZEGO wkładka do określonego stołu jest wolna?

29

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.

BradC
źródło
Czy masz włączone automatyczne rozszerzanie plików danych? Może to powodować problemy z wydajnością przy domyślnej konfiguracji.
Larry Coleman,
Czy mówimy o użyciu profilera? msdn.microsoft.com/en-us/library/ms187929.aspx
Incognito
@ Larry: Pliki danych mają znaczną wolną przestrzeń, więc nie sądzę, aby wzrost plików danych był problemem. Warto dodać do listy „rzeczy do sprawdzenia”.
BradC,
@ user210: Profilowanie wypełnienia instrukcji pokazuje mi, że zajęło to 90 sekund, nie mówi DLACZEGO. Chyba że są inne wydarzenia, które Twoim zdaniem byłyby bardziej wymowne.
BradC,

Odpowiedzi:

10

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.

mrdenny
źródło
2
Pomaga zmniejszenie wielkości partii (1000 rekordów zajmuje ~ 25 sekund). To prawdopodobnie będzie nasze obecne „obejście”. Zobaczę, czy mogę określić statystyki IO i czeka (zadanie jest uruchamiane na żądanie przez klienta, gdy ma plik do przetworzenia, więc nie zawsze mogę przewidzieć, kiedy zadanie faktycznie się uruchomi).
BradC,
7

Ć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.

SQLRockstar
źródło
6

Potrafię powiedzieć, czego szukam, analizując wydajność zapytania. Może to pomaga.

  • analizować plan wykonania zapytań i sprawdzać skany indeksu, skany tabeli, użycie funkcji konwersji_prostej dla typów danych SQL, równoległość.
  • uruchom zapytanie przy użyciu SET STATISTICS IO ON i SET STATISTICS TIME ON, aby zobaczyć czas wykonania i odczyt / zapis io dla każdej wstawki.
  • sprawdź czas oczekiwania z sysprocesses dla twojej sesji sesji.
  • uruchom profiler i wybierz standardowy szablon. wybierz następujące: Statystyka wydajności (jeśli się powtórzy, to Twój plan jest kompilowany wiele razy - niezbyt dobrze), RPC: zakończone, SQL: zakończono wsadowo i SQL: uruchomiono wsadowo. Dodaj do nich kolumn rowcounts dokładnie sprawdzić liczbę wierszy w partii. Filtruj wyniki, aby wyświetlić tylko zapytanie.
  • w końcu zbierz licznik oczekiwanej żywotności strony z Windows perfmon, a jeśli jest on mniejszy niż 300 (5 min), to SQL ma mało pamięci. Zbieramy również liczniki dysków: długość kolejki dysku , Czas dysku (pliki danych napędu), czas Disk (logach jazdy) , aby sprawdzić, czy istnieje presja na dyskach.
yrushka
źródło
5

Spróbuj użyć:

SET STATISTICS IO ON

i

SET STATISTICS PROFILE ON

STATYSTYKA IO

Może być przydatny w informowaniu, które tabele wykonują najwięcej operacji skanowania tabel, odczytów logicznych i fizycznych (używam tych trzech do skupienia się na tym, która część planu zapytań wymaga największej regulacji)

PROFIL STATYSTYCZNY

Zwróci przede wszystkim plan zapytań w formacie tabelarycznym, możesz następnie spojrzeć na kolumny We / Wy i procesora, które kosztują najwięcej w zapytaniu (czy to skanowanie tabeli w tabeli tymczasowej w porównaniu z sortowaniem, które wstawia do twojego klucz klastrowany itp.)

Andrew Bickerton
źródło