вторник, 28 июля 2015 г.

DBMS_SQLPA. Число запусков SQL Statement

В последнее время мне очень много приходится работать над вопросами оптимизации работы Oracle Database и оценивать эффект от предлагаемых рекомендаций.
Существует множество инструментов для подобного рода оценок. Это и родные инструменты Oracle, собранные в пакет Oracle Real Application Testing. И сторонние инструменты проведения нагрузочного тестирования -HP LoadRunner и т.п.
Хочу поделиться одним наблюдением, сделанным во время тестов с использованием SQL Performance Analyzer.
С использованием пакета DBMS_SQLPA можно сформировать тестовый набор sql-выражений и запускать их в различных тестовых базах данных, сравнивая результаты запусков и оценивая эффект от изменений окружения. Так можно тестировать переход на новые версии Database, операционных систем, оценивать эффект от изменения параметров Oracle DB или параметров хранения объектов.
Я с помощью SPA оценивал эффект от партиционирования объектов. И при выполнении запросов обратил внимание, что реальное время выполнения запроса сильно отличается от статистических данных, которые появляются в dba_advisor_sqlstats.
Например запрос выполнялся 20 мин, а во вьюхе появляется значение elapsed_time - 98 сек.
Никак не мог понять, как такое возможно.
Оказалось, что в версии 11.2 при выполнении тестового набора каждый запрос выполняется ни один, а несколько раз. Это поведение регулируется параметром DISABLE_MULTI_EXEC
В версии 11.2 по умолчанию значение этого параметра равно FALSE.
В зависимости от времени выполнения запроса, он (запрос) может выполняться от 2 раз (для long running SQL statement) до 10 раз (соответственно для FAST Running SQL statement). При этом первое выполнение используется для разогрева buffer cache и не учитывается в статистике выполнения запроса.
Данные о числе запусков каждого запроса можно посмотреть в представлении DBA_ADVISOR_SQLSTATS.
TESTEXEC_TOTAL_EXECSNUMBERTotal number of executions during test execute