Oracle 初始化参数
ArcGIS 不要求用户更改 Oracle 实例的默认配置,实例可在默认设置情况下运行。然而,对于大型系统,最好对 Oracle 实例配置进行一些必要的更改。
无论何时启动 Oracle 实例,Oracle 都将从 init.ora 文件或服务器参数文件 spfile.ora 读取其初始化参数。虽然这两种文件都定义实例的特征,但它们的管理方式却不同。
init.ora 文件位于 ORACLE_BASE/admin/<ORACLE_SID>/pfile 目录(或文件夹)下。通常,init.ora 是赋给 Oracle 数据库实例的初始化文件的名称,但对于任何给定的实例,该文件名实际上是 <oracle SID>.ora。例如,如果 Oracle 系统 ID (SID) 是 GIS,则该实例的 init.ora 文件将是 initGIS.ora。
如果已通过该方法启动实例,则使用 ALTER SYSTEM 命令更改参数将自动作用到服务器参数文件中。通过 init.ora 文件启动实例后,如果您想让对系统参数所做的更改不只影响数据库的当前实例,则必须使用文本编辑器手动编辑该文件。
影响共享内存的参数
本部分介绍了一部分控制共享内存分配的参数。有关 Oracle 初始化参数的详细论述,请参阅您的 Oracle 版本的 Oracle 服务器调整。
OPEN_CURSORS
Oracle 初始化参数 OPEN_CURSORS 指定在任何时刻会话可同时打开的游标数。默认值是 300。如果会话尝试打开新游标,但此时已达到可打开游标数的最大值,那么将返回 Oracle 错误 -1000。ArcGIS 保留那些打开的、频繁执行的游标以提高性能。如果 Oracle OPEN_CURSORS 参数值设置得不够大,则将遇到上面提到的错误。Oracle 文档指出,给该参数设置非常大值不会产生不利影响。因此,可以设置非常大的值,例如,设置为 2000;从实用的角度来看,这样做即可有效地消除对打开游标数的限制,但同时又能提供一种保护措施,防止流氓进程尝试消耗过量的游标资源。相反,如果要计算会话可能打开的游标数,那么根据组织的数据模型,可将下面的公式作为指导:
- 各种 ArcGIS 数据管理游标 (20) +
- 各种匿名 PL/SQL 块 (20) +
- 空间查询 - 可能每个图层 6 个 +
- 日志文件查询 (11) +
- 编辑版本化表时使用的其他查询 - 每个版本化表或图层 12 个
因此,文件中有 10 个图层被编辑时,ArcMap 应用程序可能打开 231 个游标 (20 + 20 + 60 + 11 + 120 = 231)。如果发现游标经常不够用,则可以 50 或 100 为增量增大 OPEN_CURSORS 参数值。
Oracle 10g 预配置为当实例的已打开游标数超出 1200 时,生成服务器警报。由于 1200 个打开的游标对于地理数据库来说很常见,您最好增大该警报的阈值以消除警报队列中出现无关的警告。
当运行 Oracle 实例的服务器上的内存资源不足,没有内存可用于各 Oracle 专用进程时,需要减小该参数值。要获得专用进程的内存大小要求,需要制作应用程序原型。许多 Oracle 参数和应用程序的行为(如 SQL 语句)会影响进程的内存要求。
SESSION_CACHED_CURSORS
Oracle 监视提交给每个会话的 SQL 语句。如果 Oracle 检测到多次提交同一条语句,Oracle 便会将该语句移动到游标缓存并保持该游标处于打开状态,以便以后再用。SESSION_CACHED_CURSORS 参数控制着可添加到游标缓存中的游标数。SESSION_CACHED_CURSORS 的默认值随 Oracle 版本的不同而异。如果实例没有配置为至少缓存 50 个游标,则将该参数值增大到 50。
UNDO_MANAGEMENT 和 UNDO_TABLESPACE
Oracle 对用户当前正在修改的数据存储多个副本。当修改数据的事务运行时,使用原始数据的副本为其他会话提供数据库的读一致性视图。此外,执行修改的用户可通过发布 ROLLBACK 语句来撤消作业,否则其进程可能会在事务的中途崩溃,此时 Oracle 将撤消用户正在进行的作业,将数据库恢复到一致的状态。
为了支持所有这些方案,Oracle 将预编辑的数据存储到专用的数据结构、撤消或回滚段中。可以设置 UNDO_MANAGEMENT 和 UNDO_TABLESPACE 参数,使 Oracle 自动创建和管理撤消段。要启用自动撤消管理,首先将 UNDO_MANAGEMENT 设置为“自动”。接着,将 UNDO_TABLESPACE 设置为存储系统管理撤消段的表空间的名称。
请注意,不可随意使用表空间存储系统管理撤消片段。必须在创建表空间时将表空间指定为撤消表空间。有关监视和管理自动撤消行为的详细信息,请参阅《Oracle 数据库管理员指南》(Oracle Database Administrator's Guide)。
SESSIONS
默认情况下,地理数据库被配置为允许 48 个或 64 个同步连接,具体取决于操作系统。如果将 SDE.SERVER_CONFIG 数据字典表配置为允许更多的连接,则可能需要更改 Oracle 的 SESSIONS 参数以适应新的设置。
SESSIONS 参数直接限制 Oracle 允许的总并行会话数。如果默认值不足以支持预期的地理数据库连接数,请将该参数的值增大为预期的当前连接数,再在此基础上至少增大 10%,以支持内部 Oracle 函数。
如果使用 Oracle 共享服务器配置,则 SHARED_SERVER_SESSIONS 参数的行为类似于前面论述的 SESSIONS 参数的行为,唯一的区别是 SHARED_SERVER_SESSIONS 参数仅适用于共享服务器连接。所有会话(共享服务器和专用服务器)都受更常用的 SESSIONS 参数的限制。
PROCESSES
您还可以使用 PROCESSES 参数限制 Oracle 可创建的最大进程数。使用专用服务器配置时,此过程大致相当于数据库支持的并行会话数。如果增大允许的连接数,则请确保对于一组典型的 Oracle 后台进程,PROCESSES 参数值至少等于地理数据库连接数加 25。
影响 Oracle 统计数据的参数
OPTIMIZER_MODE
保持 Oracle 参数 OPTIMIZER_MODE 的默认值不变。对于 Oracle 10g 和 11g, 默认值是 all_rows。对于多数地理数据库,此设置最为合适,并且可提高地理数据库的整体可扩展性。
影响内存的参数
设置影响内存的初始化参数时必须格外小心。给这些参数设置大于主机物理内存资源强加的限值将导致性能明显降低。
LOG_BUFFER
日志缓冲区是 Oracle 系统全局区 (SGA) 的一个组成部分,它将对数据库所做的未提交更改保存到内存,一直保存到 Oracle 后台进程可以将这些更改写入磁盘上的永久性存储器。因为这些写入操作频繁执行(至少每三秒一次),所以日志缓冲区不需要很多空间,其大小可配置为小于一兆字节。恢复日志缓冲区的大小由 LOG_BUFFER 参数控制。对于多数地理数据库,默认的日志缓冲区大小足够用。但是,对于写入操作高度频繁的数据库,当多个用户同时尝试访问日志缓冲区时,可能会影响性能。诊断和缓解这种状况需要先进的技术,例如,监视闩锁和等待事件。有关详细信息,请参阅《Oracle 数据库性能调优指南》(Oracle Database Performance Tuning Guide) 和 MetaLink 知识库。
事实上,如果将 LOG_BUFFER 的值设置得很大以处理庞大的加载事务,则可能导致性能降低。如果日志缓冲区设置得过大,则事务之间可能会发生闩锁争用情况。
SHARED_POOL_SIZE
共享池是 Oracle SGA 的另一组成部分,它存储数据字典缓存和库缓存。数据字典缓存存储有有关数据对象、可用空间和权限的信息。库缓存存储最近解析的 SQL 语句。通常,如果共享池足够大可以满足库缓存的资源要求,也就说明共享池足够大可以存储数据字典缓存。地理数据库可以从利用比一些其他 Oracle 应用程序更大的共享池中获益。ArcGIS 可以将客户端应用程序提交的 SQL 语句的缓存保存在内存中。使用大型共享池时可以有更多的游标处于打开状态,从而能减少游标管理操作和提高性能。共享池的大小由 SHARED_POOL_SIZE 参数控制。Esri 建议将 SHARED_POOL_SIZE 参数值设置为 16 MB 的倍数以适合 Esri 支持的所有系统,还有将此参数值至少设置为 128 MB:
shared_pool_size = 128,000,000
高度活跃的地理数据库支持易失性工具或宗地编辑系统可能需要 SHARED_POOL_SIZE 设置为高达 250 MB。
在这三个 SGA 缓冲区中,共享池最重要。如果 SGA 大小已达到可给其分配的最大物理内存大小,则减小缓冲器高缓大小以适应更大的共享池。
DB_CACHE_SIZE
缓冲器高缓是 Oracle SGA 的另一组成部分,它存储最近使用的数据块。数据块是数据传输的 Oracle 原子单元。无论用户何时编辑或查询数据库,Oracle 都从数据库读取数据块,然后将数据块写入到数据库。缓冲器高缓的大小由 DB_CACHE_SIZE 参数控制。
与共享池和日志缓冲区不同,缓冲器高缓没有建议的最小大小。因为调整缓冲器高缓大小的目的是将数据库尽可能多地保存在内存中,所以在考虑系统其余部分的需求后,请规划将所有剩余的内存分配给缓冲器高缓。要对此进行评估,请执行以下步骤:
- 确定服务器的物理随机存取存储器 (RAM) 的大小。
- 将这个数乘以 0.66 得出 SGA 的目标大小。
- 扣除 SHARED_POOL_SIZE 和 LOG_BUFFER 得出可用于缓冲器高缓的内存量。
- 将该数减小 10% 供给 Oracle 的内部存储器使用。
- 除以数据库块大小得出 DB_BLOCK_BUFFERS 设置值。
例如:
memory available to SGA = physical RAM * 2/3 memory available to buffer cache = (memory available to SGA - (shared_pool_size + log_buffer)) * 0.9 db_block_buffers = memory available to buffer cache / db_block_size
PGA_AGGREGATE_TARGET
为 Oracle 服务器进程的私有全局区 (PGA) 分配空间。该空间通常用作临时缓冲区,用于在表连接期间对数据进行排序和合并。将 WORKAREA_SIZE_POLICY 设置为 AUTO,然后将 PGA_AGGREGATE_TARGET 最初设置为 0.16 倍的总物理 RAM 的大小。应用程序运行一段时间后,按照《Oracle 性能调优指南和参考》 中介绍的步骤调整 PGA_AGGREGATE_TARGET。
workarea_size_policy = auto pga_aggregate_target = <total physical RAM * 0.16)
仅当 WORKSPACE_POLICY 设置为 AUTO 时,Oracle 才使用 PGA_AGGREGATE_TARGET 分配用于排序的内存。否则,Oracle 将使用较旧的手动管理排序区域的方法,该方法包括设置 SORT_AREA_SIZE 和 HASH_AREA_SIZE 参数。
使用自动工作区管理
Oracle 可以自动管理服务于用户会话的服务器进程的私有内存,其管理方式与通过自动共享内存管理 (ASMM) 管理共享内存的方式大抵相同。用于排序、散列和位图索引处理的 SQL 工作区可由 Oracle 从可用于所有 PGA 的大型内存池中进行动态分配,数据库管理员 (DBA) 不能以固定大小对其进行配置。要启用自动工作区管理,请将参数 WORKAREA_SIZE_POLICY 设置为 AUTO。然后,通过将大小指定为 PGA_AGGREGATE_TARGET 参数的值来配置可用于所有 PGA 的内存总量。默认情况下,Oracle 将 PGA 的总大小配置为 SGA 大小的 20%。尽管 PGA 的大小应根据服务器进程执行的工作类型进行分配,而不是绝对相对于 SGA 的大小,但该值仍然是一个很好的起始值。数据库在正常负载情况下运行后,您可以监视 PGA 目标并根据实际工作量来微调 PGA 目标大小。有关该过程的详细信息,请参阅《Oracle 数据库性能优调指南》(Oracle Database Performance Tuning Guide)。
使用自动共享内存管理
使用 Oracle 10g 时,您可以选择配置 SGA 的总大小并允许 Oracle 自动管理内存在构成池间的分配。这就是 ASMM,通过 SGA_TARGET 参数来调用。除了能简化 DBA 的作业(与单独配置池相比)外,使用 ASMM 还使得 Oracle 可以在实例运行同连续监视每个池的需求并动态地调整其大小。而让 DBA 在运行中执行同等级别的监控可能不切实际。您可以配置 SGA_TARGET 参数来指定 SGA 的总大小和各个池的一个或多个参数,以此给 ASMM 提供指导。指定 SGA_TARGET 和池大小后,Oracle 将池大小解释为 ASMM 为该缓存保留的最小值。
因为共享池对于地理数据库的性能非常重要,所以在使用 ASMM 时,除了设置 SGA_TARGET 外,请将最小共享池大小(SHARED_POOL_SIZE 初始化参数)至少设置为上文中推荐的 128 MB。
要使用自动工作区和自动共享内存管理,就必须将 STATISTICS_LEVEL 参数设置为 TYPICAL(默认值和建议值)或 ALL。
其他更改
虽然不是初始化参数,但可以将 UNDO_POOL 数据库资源管理器计划指令设置为允许 sde 用户的用户组使用大量的撤消空间进行压缩操作。
要使用此功能,您需要建立 sde 用户的用户组,然后将 UNDO_POOL 计划指令更改为允许此用户组使用无限制撤消池。
UNDO_POOL 标识一个资源组的成员可以同时共同分配的撤消空间的总量。
编辑版本化地理数据库时,必须定期执行压缩操作以清除旧信息并精简地理数据库中的内容。如果上次执行压缩操作后出现大量编辑内容,那么新的压缩过程将创建需要大量撤消空间的大型事务。如果 UNDO_POOL 设置得过低,压缩操作将失败,性能将变差。如果可能,为 sde 用户的用户组设置一个无限制撤消池。否则,必须监视压缩事务的大小,并对大型撤消池选择一个合适的大小。