У меня есть база данных Oracle 11g. Тестирую на вставки. База данных работает в режиме без архива. У меня настроено 3 журнала повторного выполнения, каждый по 2 ГБ.
Я пытаюсь вставить данные в тестовую таблицу. В начале все идет нормально со скоростью 15 тыс. Ин / с. Я совершаю коммит после 200 вставок.
Но после примерно 1,3 м вставленных записей он становится очень медленным, около 1-2 тыс. Ин / с. Как я заметил в обозревателе ресурсов, на этом этапе мы заполнили все журналы повторного выполнения, поэтому вставки из этих точек работают медленно.
Итак, мой вопрос: почему он становится таким медленным, когда заполняет журналы повтора, даже если я фиксирую каждые 200 записей. И как исправить эту ситуацию (кроме полного отключения логирования при вставках)
Журналы повторного выполнения записываются последовательно. Файлы данных записываются случайным образом.
Каждый жесткий диск лучше всего работает при последовательной записи, и в это время он может достичь полной пропускной способности (скажем, 100 МБ / с), потому что тогда ему не нужно искать (переставлять магнитную головку на другую дорожку и ждать, пока дорожка повернуть в нужное место). Когда нужно искать, один жесткий диск может быть ограничен, скажем, 200 поисками в секунду. Итак, если вы напишете 8 кБ, а затем перейдете в другое место, вы получите с того же диска 1,56 МБ / с (это 200 * 8). В обоих случаях диск будет загружен на 100%, но с очевидной разницей в пропускной способности (200 против 1,56). Для RAID0 несколько дисков статистически обеспечивают, скажем, n * 200 поисков в секунду.
Это не относится к SSD, в этом случае поиск происходит практически мгновенно.
В начальный период ваши файлы данных не записываются слишком много, потому что все вставки попадают в кеш базы данных. Журнал повторов всегда записывается немедленно, без (большой) буферизации, он быстрый и последовательный. В журнале повторения нет ничего плохого. Через некоторое время у вас просто закончится свободный кеш, и модуль записи db пытается освободить некоторый кеш, записывая в файлы данных. Если вы вставляете просто одну таблицу в одно табличное пространство, файл данных, вероятно, будет записан последовательно или полупоследовательно.
Так почему же случайная операция? Возможно, у вас есть что-то дополнительное в базе данных, например: индексы, разделы, аудит, другие таблицы и т. Д. Все это способствует рандомизации.
Было бы полезно разделить каждую последовательную операцию, выполняемую на другом наборе физических жестких дисков, и поместить все случайные операции на другой набор физических дисков. В противном случае последовательная производительность сильно пострадала бы. В вашем случае с точки зрения производительности неправильно размещать файлы повторного выполнения на тех же физических жестких дисках, что и файлы данных.
Для получения дополнительной информации лучше всего изучить снимки состояния автоматического репозитория рабочей нагрузки (AWR) (это простые текстовые отчеты).