В моята наскоро обновена производствена база данни виждам редица SQL изрази, които сега изпитват голямо изчакване при събитието „преоразмеряване на асинхронния дескриптор“. Наскоро надстроих от 11.1.0.7 до 11.2.0.2 и SQL операторите, които никога не са чакали това събитие, сега се хващат.
Oracle 11.2 леко промени начина, по който базата данни и ядрото на ОС извършват асинхронни I/O извиквания. Това, което се случва е, че има редица асинхронни I/O дескриптори, които да могат да обработват асинхронните I/O повиквания. Когато броят на асинхронните I/O повиквания се увеличава, броят на дескрипторите също се увеличава. Когато броят на асинхронните I/O повиквания намалява, броят на дескрипторите намалява по подобен начин.
Преди Oracle да може да увеличи броя на дескрипторите, той трябва да изчака всички процеси, които в момента изпълняват асинхронно I/O, да завършат своите I/O повиквания. Това ужасно действие наистина убива „асинхронната“ част на I/O! След като всички процеси завършат своите ansych I/O извиквания, Oracle може след това да промени дескрипторите нагоре или надолу в зависимост от работното натоварване.
Ако вашият процес току-що приключи със завършването на своя асинхронен I/O, преди да може да направи друго асинхронно I/O извикване, той трябва да изчака Oracle да промени броя на дескрипторите. Като такъв, вие чакате събитието за изчакване „преоразмеряване на асинхронния дескриптор“.
Изглежда, че това е грешка 9829397 и можете да изтеглите пач за него от Metalink. Този проблем е коригиран в 11.2.0.3, така че се появява само в 11.2.0.1 и 11.2.0.2. Едно решение е да деактивирате Asynch I/O, но за мен това решение е крайно нежелателно. Човек може също да намали случаите на това чакане, като намали техния директен I/O и настрои техните SQL изрази.