Есть ли улучшение производительности при распределении таблиц базы данных по разным жестким дискам?
Мне нужно получить доступ ко многим различным схемам одновременно, и мне было интересно, может ли добавление дополнительных жестких дисков значительно улучшить производительность, когда я распределяю таблицы по разным жестким дискам.
Итак, скажем, у меня есть 100 таблиц и 1 жесткий диск против 100 таблиц и 10 жестких дисков. Будет ли это иметь значение? Или мне лучше связать жесткие диски в конфигурации RAID?
Чем больше жестких дисков, тем выше теоретическая производительность ввода-вывода. Чем полезная сумма сильно отличается по способу. Во многих реальных приложениях (и для меньшего количества дисков) увеличение производительности ввода-вывода даже не близко к линейному.
Сценарии, в которых большее количество дисков не увеличивает производительность, - это, например, те, в которых достигаются ограничения контроллера (RAID). 10 высокопроизводительных твердотельных накопителей на более старом или дешевом (RAID) контроллере часто приводят к тому, что контроллер является ограничивающим фактором, а не диск. Уровни RAID также, по крайней мере, столько же о защите данных, сколько о производительности.
2 диска в RAID 1 (зеркалирование) дает нулевую дополнительную производительность записи, но на хорошем контроллере все равно удваивает производительность чтения.
Назначение (виртуальных) дисков определенным задачам вручную обеспечивает гарантированные пути ввода-вывода для этих задач, обеспечивая определенный уровень параллелизма этих задач, и это, например, то, что любят делать администраторы баз данных. Конечно, это также ограничивает пиковую производительность каждой отдельной задачи. И при любой (ручной) настройке неправильная настройка может сильно снизить производительность :)
Один корпоративный вращающийся диск SAS 15k обеспечивает обычно около 200–250 операций ввода-вывода в секунду. Проще говоря, 10 дисков предлагают в десять раз больше.
Если в вашем примере преимущественно используется одна таблица, назначение этой таблицы на 1 диск и наличие других 99 таблиц на других оставшихся дисках не дает ощутимой выгоды, фактически вы все равно будете ограничены примерно 200 IOPS. В этом сценарии со всеми 100 таблицами на одном томе RAID 10 у вас будут все 10 дисков и, следовательно, более 2000 операций ввода-вывода в секунду для операций чтения и 1000 операций ввода-вывода в секунду (эффективные ресурсы половина дисков, 5 дисков из-за зеркалирования) для записи операции ... большое увеличение.
Увеличение пропускной способности ввода-вывода почти всегда увеличивает производительность. Однако не существует волшебной формулы, определяющей, сколько жестких дисков следует использовать для определенного количества таблиц или баз данных. Необходимо учитывать слишком много факторов: размер данных, дизайн схемы, интенсивность записи или чтения, количество запросов и т. Д.
Помимо добавления дополнительного оборудования, он всегда помогает анализировать структуры таблиц и наиболее распространенные запросы, выполняемые к вашим базам данных. Иногда просто добавление индекса для часто запрашиваемых данных творит чудеса, которые даже без дополнительных затрат на аппаратное обеспечение.
Помимо увеличения количества физических дисков, вам необходимо изменить Oracle, чтобы запускать больше параллельных процессов. Я делаю это с помощью:
NAME CURRENT_MEMORY_VALUE
------------------------------ ---------------------
parallel_max_servers 32
parallel_min_servers 8
parallel_servers_target 32
parallel_threads_per_cpu 4
Команды для внесения этих изменений:
alter system set PARALLEL_MIN_SERVERS=8 scope=memory; <== RAC
alter system set PARALLEL_MIN_SERVERS=8 scope=spfile sid='*'; <== RAC
alter system set PARALLEL_MAX_SERVERS=32 scope=memory; <== RAC
alter system set PARALLEL_MAX_SERVERS=32 scope=spfile sid='*'; <== RAC
alter system set PARALLEL_SERVERS_TARGET=32 scope=memory; <== RAC
alter system set PARALLEL_SERVERS_TARGET=32 scope=spfile sid='*'; <== RAC
alter system set PARALLEL_THREADS_PER_CPU=4 scope=memory; <== RAC
alter system set PARALLEL_THREADS_PER_CPU=4 scope=spfile sid='*'; <== RAC
alter system set PARALLEL_MIN_SERVERS=8 scope=both; <== NON RAC
alter system set PARALLEL_MAX_SERVERS=32 scope=both; <== NON RAC
alter system set PARALLEL_SERVERS_TARGET=32 scope=both; <== NON RAC
alter system set PARALLEL_THREADS_PER_CPU=4 scope=both; <== NON RAC