Что означает SGA_MAX_SIZE и SGA_TARGET?

Казалось бы, все очевидно. Но нет.

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

Во-вторых, может показаться, что SGA_MAX_SIZE — это тот максимум, на который ASMM может рассчитывать при выделении в ОЗУ пространства под разные пулы (java pool, shared pool и т.д.), а SGA_TARGET — это рекомендуемое пространство или, другими словами, минимум.

На самом деле все обстоит несколько по-другому.

Когда мы включаем ASMM и выставляем оба вышеприведенных параметра, Oracle не позволит суммарному размеру пулов быть больше, чем SGA_TAGET.

Зачем тогда нужен SGA_MAX_SIZE? Это для того, чтобы без перезапуска базы можно было увеличить SGA_TARGET, если заметно, что производительность системы страдает. Что логично, увеличить мы можем вплоть до SGA_MAX_SIZE, но не более. На остальные операции уже потребуется перезапуск БД. При этом запущенный инстанс все равно занимает в ОЗУ не SGA_TARGET, а SGA_MAX_SIZE.

Таким образом понимаем, что SGA_MAX_SIZE — это параметр инициализации, а SGA_TARGET — это динамический параметр, который можно изменять на работающем инстансе.

Если SGA_TARGET не устанавливать, Oracle сожрет все то, что дано ему параметром SGA_MAX_SIZE.