Основная разница в производительности между двумя экземплярами базы данных Oracle - PullRequest
2 голосов
/ 20 апреля 2010

Я работаю с двумя экземплярами базы данных Oracle, назовите их one и two. two работает на более качественном оборудовании (жесткий диск, память, процессор), чем one, а two на одну младшую версию отстает от one с точки зрения версии Oracle (обе версии 11g). Оба имеют одинаковую таблицу table_name с точно такими же определенными индексами. Я загружаю 500 000 одинаковых строк в table_name в обоих случаях. Затем я запускаю в обоих случаях:

delete from table_name;

Эта команда занимает 30 секунд для выполнения one и 40 минут для выполнения two. Выполнение INSERT и UPDATE для двух таблиц имеет сходные различия в производительности. Кто-нибудь есть какие-либо предложения о том, что может иметь такое радикальное влияние на производительность между двумя базами данных?

Ответы [ 4 ]

3 голосов
/ 20 апреля 2010

Сначала я сравнил бы конфигурации экземпляров - SELECT NAME, VALUE из V $ PARAMETER ORDER BY NAME и поместил результаты в текстовые файлы для обоих экземпляров, а также использовал некоторый инструмент сравнения файлов, чтобы выделить различия. Все, кроме различий из-за имени базы данных и расположения файлов, должно быть исследовано. Крайним случаем может быть отсутствие архивирования журнала в одной базе данных и 5 назначений архива, определенных в другой.

Если у вас нет доступа к файловой системе на хосте базы данных, найдите кого-то, у кого он есть, и попросите его получить файлы трассировки и результаты tkprof при запуске сеанса, ALTER SESSION SET sql_trace = true, а затем выполните удаление , Это откроет любой рекурсивный SQL из-за триггеров в таблице (которые вы можете не иметь), аудита и т. Д.

2 голосов
/ 20 апреля 2010

Если вы можете отслеживать столбцы wait_class и события в v $ session для удаления сеанса, вы получите представление о причине задержки. Обычно я ожидаю, что полная таблица DELETE будет привязана к диску (индикация ввода-вывода класса ожидания или, возможно, конфигурация). Он должен читать данные из таблицы (чтобы он знал, что удалять), обновлять блоки данных и блоки индекса, чтобы удалить записи, которые генерируют много записей для табличного пространства UNDO и журнала повторов.

В производственной среде базовые файлы могут быть распределены по нескольким дискам (даже SSD). В средах разработки и тестирования все они могут быть привязаны к одному устройству, а движения головок на диске сильно замедляются. Я мог видеть, что прыгать SQL может быть в десять раз. Ваш хуже, чем это.

Если в таблице есть параллельная активность [wait_class of Concurrency]] (например, вставка других сессий), вы можете получить конкуренцию за блокировку или обе сессии пытаются создать индекс.

1 голос
/ 20 апреля 2010

Что-то явно не так в экземпляре two . Я предлагаю вам взглянуть на эти вопросы и их ответы:

В частности:

  • Есть ли у вас неиндексированные ссылки на внешние ключи (причина удаления 1 занимает много времени - посмотрите этот скрипт из AskTom ),
  • Есть ли у вас ON DELETE TRIGGER на столе?
  • Есть ли у вас какие-либо действия в экземпляре two (если эта таблица постоянно обновляется, вас могут заблокировать другие сеансы)
1 голос
/ 20 апреля 2010

обратите внимание: я не dba ...

У меня в кабинете написано следующее:

В экстренных случаях попросите dba по вызову:

  1. План проверки
  2. Статистика выполнения
  3. Сбросить общий буферный пул

Число 2 и / или 3 обычно исправляют запросы, которые работают в одной базе данных, ноне другой или который работал вчера, но не сегодня ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...