您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

sp_poolconfig

语法

  • 在现有高速缓存中创建内存池或者更改内存池的大小:

    
    sp_poolconfig <cache_name>[, "<mem_size> [P | K | M | G]", "<config_pool>K" 
    	[, "<affected_pool> K"], instance <instance_name>]
    

  • 更改池的清洗大小:

    
    sp_poolconfig <cache_name>, "<affected_poolK>", "wash=<size>[P|K|M|G]"
    

  • 更改池的异步预取百分比:

    
    sp_poolconfig <cache_name>, "<affected_poolK>", 
    	"local async prefetch limit=<percent> "
    

    参数

    <cache_name>

    是现有数据高速缓存的名称。

    <mem_size>

    是将要创建的内存池的大小或具有指定 I/O 大小的现有池的新总大小。池的最小大小为 256 个逻辑服务器页。对于逻辑页大小为 2 K 的服务器,最小大小为 256 K。指定大小的单位,用 P 表示页,用 K 表示千字节,用 M 表示兆字节,用 G 表示千兆字节。缺省单位为千字节。

    <config_pool>

    是内存池中(在其中内存将被分配或删除)执行的 I/O 大小。

    有效 I/O 大小是逻辑页大小的倍数,最大是该大小的 4 倍。

    <affected_pool>

    是要释放内存的或要修改池属性(如 'wash size' 和 'prefetch limit')的内存池中执行的 I/O 大小。如果未指定 <affected_pool>,则内存取自最低逻辑页大小的内存池。

    <instance_name>

    (Cluster Edition) 要调整缓冲池的实例的名称。

    wash=<size>

    更改内存池的清洗大小(高速缓存中 SAP ASE 服务器将脏页写入磁盘的位置)。

    local async prefetch limit=<percent>

    设置可用于保存已由异步预取读入高速缓存、但尚未使用的缓冲区的池中缓冲区所占的百分比。有效值为 0 到 100。如将预取限制设置为 0,将禁用池中的异步预取操作。

    示例

    示例 1

    在具有 10 MB 空间的 pub_cache 数据高速缓存中创建 16K 池。所有空间都取自缺省的 2K 内存池:

    
    sp_poolconfig pub_cache, "10M", "16K"
    

    示例 2

    从 pub_cache 的 64K 池中为 32K 池创建 16 MB 的空间:

    
    sp_poolconfig pub_cache, "16M", "32K", "64K"
    

    示例 3

    报告 pub_cache 的当前配置:

    
    sp_poolconfig "pub_cache"
    

    示例 4

    从 pub_cache 中删除 16K 内存池,将分配给它的所有内存都放置于 2K 池中:

    
    sp_poolconfig pub_cache, "0K", "16K"
    

    示例 5

    将 pubs_cache 中 2K 池的清洗大小更改为 508K:

    
    sp_poolconfig pub_cache, "2K", "wash=508K"
    

    示例 6

    将 2K 池的异步预取限制更改为 15%:

    
    sp_poolconfig pub_cache, "2K", "local async prefetch limit=15"
    

    示例 7

    (集群环境)在实例 blade1 上的缺省数据高速缓存内创建大小为 25 MB 的 16KB 缓冲池:

    
    sp_poolconfig 'default data cache', '25M', '16K', 'instance blade1'
    

    示例 8

    (集群环境)显示实例 blade1 上的缺省数据高速缓存中的缓冲池配置:

    
    sp_poolconfig 'default data cache', 'instance blade1'
    

    示例 9

    (集群环境)显示集群中所有实例上命名高速缓存 c_log 的缓冲池配置:

    
    sp_poolconfig c_log
    

    用法

  • 在您使用 sp_cacheconfig 创建数据高速缓存时,所有空间都被分配给逻辑页大小的内存池。sp_poolconfig 将数据高速缓存划分为若干具有更大 I/O 大小的附加池。

  • 如果高速缓存中没有大 I/O 内存池,则 SAP ASE 服务器将以逻辑页大小单位(数据页大小)对绑定到该高速缓存的所有对象执行 I/O。您常常可以通过配置执行大 I/O 的池来提高性能。16K 内存池将对逻辑页大小为 2K 的服务器在单个 I/O 中读写八个数据页。

  • 高速缓存名称和 I/O 大小的组合必须是唯一的。换言之,在特定数据高速缓存中只能用 sp_poolconfig 命令指定一个具有给定 I/O 大小的池。

  • 一次对于单个高速缓存只能有一个 sp_poolconfig 命令处于活动状态。如果第一个命令未完成就发出第二个 sp_poolconfig 命令,它将在第一个命令完成前处于休眠状态。

  • 下图显示服务器上的一个数据高速缓存,它将 2K 逻辑页用于以下项:

    - 缺省数据高速缓存包含一个 2 K 的缓冲池和一个 16 K 的缓冲池

    - 用户高速缓存包含一个 2 K 的缓冲池和一个 16 K 的缓冲池

    - 日志高速缓存包含一个 2 K 的缓冲池和一个 4 K 的缓冲池

    ![](https://help.sap.com/doc/29a04b8081884fb5b715fe4aa1ab4ad2/16.0.3.0/zh-CN/loioa5d8392bbc2b1014a283af39f88166f8_LowRes.png)

    此图显示带有缺省高速缓存和用户定义的高速缓存的数据高速缓存。

  • 在 2K 页大小服务器的缺省数据高速缓存中,可以创建 I/O 大小最大为 16K 的缓冲池。

  • 内存池的最小大小是 256 个逻辑页(例如逻辑页大小为 2K 的服务器的最小大小是 512K)。您不能通过将内存转移到另一个池,来将任何高速缓存中的任何内存池的大小减少到 256 页以下。

  • 两种情况可能导致池小于 512K:

    - 如果您尝试通过将池的大小设置为零来删除该池,并且其中某些页正在使用中,则 sp_poolconfig 将尽可能多的减少池大小,并显示警告消息。池的状态将被设置为“Unavailable/deleted”。

    - 如果您尝试移动缓冲区以创建新池,并且无法将足够的缓冲区移入这个新池中,则 sp_poolconfig 将移动尽可能多的缓冲区,并且高速缓存状态被设置为“Unavailable/too small”。

  • 在上述两种情况中,都可以在以后重新尝试执行命令。该池在服务器重新启动后还将被删除或更改为期望的大小。

  • 您可以在 SAP ASE 服务器处于活动状态时创建内存池,不必进行重新启动这些内存池即可生效。但是,SAP ASE 服务器只能移动“可用”缓冲区(未在使用中的缓冲区或不包含尚未写入磁盘的更改的缓冲区)。在配置池或更改其大小时,SAP ASE 服务器将尽可能多的内存移入该池中并输出信息性消息,显示请求的大小和该池的实际大小。在 SAP ASE 服务器重新启动后,所有池都以配置的大小创建。

  • 某些 dbcc 命令和 drop table 只执行逻辑页大小 I/O。dbcc checkstorage 可以执行大 I/O,而 dbcc checkdb 对表执行大 I/O,对索引执行逻辑页大小 I/O。

  • 在为事务日志配置的 I/O 是逻辑页大小的两倍的情况下,大多数 SAP ASE 服务器的执行效果最佳。如果缺省高速缓存或具有绑定到它的事务日志的高速缓存是用两倍逻辑页大小的内存池配置的,则 SAP ASE 服务器使用两倍逻辑页大小的缺省 I/O 大小。否则,它将使用逻辑页大小的内存池。

  • 您可以使用 sp_logiosize 系统过程增加数据库的缺省日志 I/O 大小。但是,您指定的 I/O 大小在绑定到事务日志的高速缓存中必须具有相同大小的内存池。如果不是这样,SAP ASE 服务器将使用逻辑页大小的内存池。

    清洗百分比和 sp_poolconfig

    清洗大小的缺省值因池大小不同而不同。

    池大小 缺省清洗大小
    小于 300 MB 缺省清洗大小设置为池中缓冲区的 20%。
    大于 300 MB 缺省清洗大小是 300 MB 中缓冲区数量的 20%。

    清洗大小的最小设置为 10 个缓冲区,最大设置为池大小的 80%。

    每个内存池都在该池中缓冲区链的最近使用最少的(LRU)端包含一个清洗区。一旦脏页(在处于高速缓存中时已被更改的页)移入该清洗区后,SAP ASE 服务器就将启动对这些页的异步写入。清洗区必须足够大,以便页可在到达池的 LRU 端之前写入磁盘。在 SAP ASE 服务器需要等待干净缓冲区时,性能会受到影响。

    缺省百分比(在清洗区中放置 20% 的缓冲区)对于大多数应用程序而言是足够的。如果您使用非常大的内存池,并且应用程序具有非常高的数据修改率,则最好将该大小增加到池的 1% 或 2%。运行 sp_sysmon 来查看建议,或与 SAP 技术支持联系以获取有关选择有效清洗大小的详细信息。

    本地异步预取百分比和 sp_poolconfig

    池的异步预取百分比的缺省值是由配置参数 global async prefetch limit 设置的。池限制始终高于全局限制。

    若要禁用池中的预取操作(如果全局限制是非零数值),则将池的限制设置为 0。