Оптимизация экземпляров Oracle - PullRequest
3 голосов
/ 21 февраля 2009

Я работаю с командой, которая разрабатывает приложение, которое работает на SQL Server и Oracle.

SQL Server имеет концепцию экземпляра, который может содержать несколько баз данных. Oracle 10g требует одного экземпляра для каждой базы данных (и может допускать больше для избыточности), поэтому для каждой базы данных, которую мы запускаем, у нас есть совершенно отдельный набор процессов, и, следовательно, гораздо большее использование памяти.

Из-за этого мы начали больше переходить на один экземпляр с отдельными схемами. Однако мы по-прежнему хотим, чтобы данные отдельных клиентов (или машин-разработчиков) были разделены.

Большинство наших экземпляров создаются с использованием локально разработанных сценариев (например, oradim в Windows).

Что можно сделать, чтобы сократить требования к использованию памяти, площади и т. Д. Экземпляров Oracle, чтобы несколько экземпляров могли безопасно работать на одном компьютере? Linux или Windows - лучший хост? Можем ли мы легко получить выгоду, отключив дополнительные функции (интеллектуальный анализ данных, Oracle Text и т. Д.), Которые нам не нужны?

Ответы [ 7 ]

2 голосов
/ 21 февраля 2009

Память ИМХО является наиболее важной для Oracle производительности.

Запуск нескольких баз данных подразумевает хранение нескольких наборов кэшированных SQL и PL/SQL, несколько кэшей данных для системных таблиц и т. Д.

Если вам просто нужно хранить данные отдельно, вы можете создать разные TABLESPACES для разных пользователей. Вам все равно придется поделиться LOGFILES.

Отключение дополнительных функций, таких как Data Mining, вам мало чем поможет, так как они не потребляют память, когда они не используются.

Вам, безусловно, понадобится уменьшить любые значения памяти, но трудно сказать, что вы должны хранить, а какие - уменьшать, не видя дизайн базы данных.

Как очень неточное практическое правило, если у вас есть OLTP база данных, то есть небольшие таблицы и высокий уровень параллелизма, вы, вероятно, должны пожертвовать sort_area_size и hash_area_size, но придерживайтесь db_block_buffers как можно выше.

Если у вас большие таблицы, использующие HASH JOINS и MERGE JOINS, вам понадобятся sort_area_size и hash_area_size для эффективных объединений и упорядочения, но вы можете уменьшить db_block_buffers, так как вы не сможете кэшируйте эти таблицы в любом случае.

Linux и Windows не сильно отличаются с точки зрения производительности Oracle. Linux, однако, грации LOCK_SGA. Windows тоже пытается это сделать, но может поменяться в сложных условиях памяти.

1 голос
/ 24 февраля 2009

Можете ли вы добавить память на сервер? Вы можете купить 32 ГБ памяти менее чем за 1000 долларов.

1 голос
/ 21 февраля 2009

Согласитесь с концепцией «один экземпляр на сервер». Если вы хотите предоставить некоторым пользователям льготный режим по сравнению с другими или обеспечить, чтобы каждое приложение получило достаточный фрагмент базы данных, изучите управление ресурсами и профили.

http://download.oracle.com/docs/cd/B19306_01/network.102/b14266/admusers.htm#i1012785

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_2007.htm#sthref4352

http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/dbrm.htm#ADMIN027

Хранение данных в отдельных схемах (и табличных пространствах на физическом уровне) должно обеспечить надлежащее разделение данных клиента. Пока вы не разделяете табличные пространства между схемами, tt становится (относительно) тривиальным для использования экспортных и переносимых табличных пространств для извлечения и разделения отдельных схем, чтобы вы могли перемещать их между базами данных (и, следовательно, экземплярами), если впоследствии необходимо их на своем собственном сервере.

1 голос
/ 21 февраля 2009

Если у вас есть отдельные схемы, у вас есть данные об отдельных клиентах. Зачем нужно больше экземпляров? Один экземпляр на машину лучше всего подходит для среды producton.

Для среды разработки вы можете сделать другой выбор. Но среда разработки и среда производства должны быть разделены.

1 голос
/ 21 февраля 2009

Если вашей основной целью является разделение клиентских данных, нет необходимости запускать несколько экземпляров. Есть два типа разделения, которые вы можете достичь. Вы уже достигли первого логического разделения, поместив каждого клиента в отдельную схему. Чтобы физически разделить данные, создайте табличное пространство для каждого клиента. Табличное пространство - это группа фактических файлов базы данных. Используя их, вы контролируете, где физически хранятся ваши данные. Назначьте табличное пространство клиента в качестве «табличного пространства по умолчанию» при создании схемы для клиента.

Если вы не хотите запускать разные версии Oracle на одном и том же сервере, редко есть причина запустить более одного экземпляра. Чтобы получить максимальную отдачу от вашего единственного экземпляра, поместите как можно больше его в память и используйте инструменты, такие как TOAD, или включенные инструменты Oracle, чтобы оптимизировать распределение памяти для различных процессов Oracle.

1 голос
/ 21 февраля 2009

MEMORY_TARGET - это параметр, который вы хотите установить, если вы используете Oracle 11g.

http://download.oracle.com/docs/cd/B28359_01/server.111/b28320/initparams133.htm

Когда вы добавляете больше экземпляров базы данных на один и тот же сервер, вам нужно будет изменить этот параметр вниз для всех остальных экземпляров, чтобы вы не использовали слишком много памяти на сервере и не выполняли обмен. В Oracle 10g вы устанавливаете PGA_AGGREGATE_TARGET и SGA_TARGET.

http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams157.htm

К сожалению, чем больше экземпляров Oracle вы добавляете, тем сложнее настраивается и тем медленнее работает система.

У меня мало информации о Windows и Linux.

1 голос
/ 21 февраля 2009

Потребление памяти будет приходить из следующих областей:

  1. на экземпляр SGA
  2. за сеанс UGA, PGA (сортировка и т. Д.)
  3. разные. другие требования к памяти для каждого процесса, не охваченные выше (например, стек и куча, используемые каждым процессом оракула, память, используемая фактическими исполняемыми образами и т. д.)

Стоимость 1 стоит того, чтобы не дать разработчикам и клиентам перегрузить буферные кеши друг друга. Те экземпляры, которые не заботятся о таких вещах, должны быть объединены.

Вы можете принять на себя стоимость 2, оплаченную в той или иной форме всеми СУБД (и исключительно в зависимости от конфигурации вашей СУБД), так что это не компромисс.

Я бы посчитал, что влияние 3 лучше всего уменьшить в Linux из-за fork и совместного использования страниц , так что вы платите только за то, что используете. В современных * nix-системах подход fork-вместо-многопоточности чрезвычайно эффективен как с точки зрения процессора, так и с точки зрения памяти, предлагая при этом множество других преимуществ (вам практически не нужно бояться утечек памяти).


Сказав это, не забывайте, что показания памяти из диспетчера задач Windows или из top могут вводить в заблуждение относительно фактического потребления памяти процессом из-за «двойного счета»: сегмента совместно используемой памяти, а также размер фактических исполняемых файлов оракула и динамических библиотек может быть подсчитан для каждого процесса, когда фактически эта память распределяется (и используется только один раз) всеми вовлеченными процессами. В Unix используйте «pmem» или «cat / proc // maps», чтобы увидеть, сколько памяти фактически используется процессом и сколько разделяется.

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