# DBCA计算公式(近似)
total_memory = 物理内存
shared_pool_size =
CASE
WHEN total_memory <= 1GB THEN 80MB
WHEN total_memory <= 4GB THEN total_memory * 0.1
WHEN total_memory <= 16GB THEN 400MB
ELSE total_memory * 0.05
END
6. 如何确定合适的值
监控共享池使用
sql
-- 检查共享池使用率
SELECT
ROUND(SUM(bytes)/1024/1024, 2) "Total(MB)",
ROUND(SUM(bytes - CASE name WHEN 'free memory' THEN bytes ELSE 0 END)/1024/1024, 2) "Used(MB)",
ROUND(SUM(CASE name WHEN 'free memory' THEN bytes ELSE 0 END)/1024/1024, 2) "Free(MB)",
ROUND((SUM(bytes - CASE name WHEN 'free memory' THEN bytes ELSE 0 END) / SUM(bytes)) * 100, 2) "Usage(%)"
FROM v$sgastat
WHERE pool = 'shared pool';
-- 检查库缓存命中率
SELECT
1 - (SUM(reloads) / SUM(pins)) "Library Cache Hit Ratio"
FROM v$librarycache
WHERE namespace IN ('SQL AREA', 'TABLE/PROCEDURE', 'BODY', 'TRIGGER');
-- 检查空闲内存是否充足
SELECT * FROM v$sgastat
WHERE pool = 'shared pool'
AND name = 'free memory'
AND bytes < 100*1024*1024; -- 少于100MB
根据负载类型调整
sql
-- OLTP系统(大量小事务)
-- shared_pool_size = SGA的15-20%
-- 数据仓库(复杂查询)
-- shared_pool_size = SGA的25-35%
-- 混合负载
-- shared_pool_size = SGA的20-25%
7. 调整建议
自动管理(推荐)
sql
-- 启用自动共享内存管理
ALTER SYSTEM SET SGA_TARGET = 4G SCOPE=SPFILE;
ALTER SYSTEM SET SHARED_POOL_SIZE = 0; -- 设为0让Oracle自动管理
-- 或启用自动内存管理
ALTER SYSTEM SET MEMORY_TARGET = 8G SCOPE=SPFILE;
ALTER SYSTEM SET SHARED_POOL_SIZE = 0;
ALTER SYSTEM SET SGA_TARGET = 0;
手动设置(特殊情况)
sql
-- 如果必须手动设置
-- 计算当前合理值
SELECT
ROUND(SUM(bytes)/1024/1024) current_mb,
ROUND(SUM(bytes)*1.2/1024/1024) suggested_mb
FROM v$sgastat
WHERE pool = 'shared pool';
-- 设置新值
ALTER SYSTEM SET SHARED_POOL_SIZE = 1G SCOPE=SPFILE;
8. 最佳实践建议
使用自动管理:除非有特殊需求
监控使用率:保持命中率>95%
避免频繁调整:稳定比最优值更重要
考虑保留区:
sql
-- 设置共享池保留区
ALTER SYSTEM SET SHARED_POOL_RESERVED_SIZE = 50M;