Невозможно вернуть исходную производительность запроса после DBMS_STATS.GATHER_DATABASE_STATS и DBMS_STATS.DELETE_DATABASE_STATS - PullRequest
0 голосов
/ 01 ноября 2018

Вот что происходит:

1) Я выполняю какой-то запрос, который не очень хорошо оптимизирован - он выполняется за 16 секунд (усредненное стабильное число после 10 тестовых прогонов); в плане выполнения указано - dynamic sampling used for this statement (level=2), поэтому в нем нет статистики для этого запроса.

2) Я бегу exec DBMS_STATS.GATHER_DATABASE_STATS

3) Я снова запускаю тот же запрос - он выполняется за 46 секунд (опять-таки среднее число) и не становится ниже; на этот раз в плане выполнения не указано - dynamic sampling used for this statement (level=2), поэтому в нем есть статистика для этого запроса.

4) Я притворяюсь взбешенным, потому что запрос выполняется дольше, чем без статистики, поэтому я пытаюсь решить проблему, выполнив exec DBMS_STATS.DELETE_DATABASE_STATS; exec DBMS_STATS.DELETE_DATABASE_STATS(NULL, NULL, NULL, DBMS_STATS.AUTO_INVALIDATE, 'ALL', TRUE); или для более старых версий Oracle SQL Server: exec DBMS_STATS.DELETE_DATABASE_STATS(NULL, NULL, NULL, DBMS_STATS.AUTO_INVALIDATE, TRUE);

5) Я снова запускаю тот же запрос - не повезло. Хотя в плане выполнения снова указано - dynamic sampling used for this statement'(level=2), запрос по-прежнему выполняется за 46 секунд и не менее. План выполнения отличается как от 1, так и от 3; так ясно, что Oracle не убрал некоторые статистические данные.

6) Я сдаюсь и запускаю инструмент восстановления базы данных Oracle. После этого я снова в точке 1. Я могу снова и снова надежно воспроизводить этот сценарий.

Все тесты выполняются через Oracle SQL Developer, подключенный к локальному экземпляру Oracle Database 11gR2 Express Edition для Windows x64 (в Windows 10), работающему на SSD, процессоре i7, 16 ГБ ОЗУ. Во время тестов других систем, использующих эту базу данных, нет.

Вопрос в следующем: как полностью восстановить базу данных Oracle от вреда, нанесенного безрассудным выполнением exec DBMS_STATS.GATHER_DATABASE_STATS, если я не хочу полностью восстанавливать базу данных из резервной копии?

Я пропускаю некоторые параметры для DELETE_DATABASE_STATS или происходит что-то еще, и база данных каким-то образом перестраивается после однократного запуска статистики, поэтому планировщик выполнения больше не может вернуться к самому первому плану?

...