W mojej niedawno zaktualizowanej produkcyjnej bazie danych widzę wiele instrukcji SQL, w przypadku których występują wysokie oczekiwania na zdarzenie „asynch deskryptor zmiany rozmiaru”. Niedawno zaktualizowałem wersję 11.1.0.7 do 11.2.0.2, a instrukcje SQL, które nigdy nie czekały na to wydarzenie, są teraz przechwytywane.
Oracle 11.2 nieznacznie zmienił sposób, w jaki baza danych i jądro systemu operacyjnego wykonywały asynchroniczne wywołania we/wy. Dzieje się tak, że istnieje wiele asynchronicznych deskryptorów we/wy, które będą w stanie obsłużyć asynchroniczne wywołania we/wy. Wraz ze wzrostem liczby asynchronicznych wywołań we/wy wzrasta również liczba deskryptorów. Gdy liczba asynchronicznych wywołań we/wy spada, liczba deskryptorów jest zmniejszana w podobny sposób.
Zanim firma Oracle będzie mogła zwiększyć liczbę deskryptorów, musi poczekać, aż wszystkie procesy, które aktualnie wykonują asynchroniczne operacje we/wy, zakończą swoje wywołania we/wy. Ta straszna akcja naprawdę zabija „asynchroniczną” część I/O! Gdy wszystkie procesy zakończą swoje wywołania ansych I/O, Oracle może zmienić deskryptory w górę lub w dół, w zależności od obciążenia.
Jeśli twój proces właśnie zakończył swoje asynchroniczne we/wy, zanim będzie mógł wykonać kolejne wywołanie asynchronicznego we/wy, musi poczekać, aż Oracle zmodyfikuje liczbę deskryptorów. W związku z tym czekasz na zdarzenie oczekiwania „zmiana rozmiaru deskryptora asynchronicznego”.
Wygląda na to, że jest to błąd 9829397 i możesz pobrać dla niego łatkę z Metalink. Ten problem został rozwiązany w 11.2.0.3, więc pojawia się tylko w 11.2.0.1 i 11.2.0.2. Jednym z obejść jest wyłączenie Asynch I/O, ale dla mnie to obejście jest wysoce niepożądane. Można również zredukować występowanie tego zdarzenia oczekiwania, redukując ich bezpośrednie we/wy i dostrajając instrukcje SQL.