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

目录缓存

目录高速缓存是为工作保留的内存的一部分,必须在 SAP IQ 环境之外进行。目录是由 SQL Anywhere RDBMS(ASA 或 SA)管理和维护的 SAP IQ 引擎的一部分。目录处理不引用 SAP IQ 对象和结构的任何操作。此外,将结果返回到客户端应用程序时,也会由目录进行处理。

通常,目录不会频繁使用,但最好了解在需要大量使用目录时如何调整目录大小。

在大多数环境中,目录高速缓存的大小应该为 RAM 量是目录文件大小的两到八倍。如果目录文件(.db 文件)为 25 MB,则目录高速缓存的大小应为 50 到 200 MB。对于需要支持超过 50-100 个并发用户的环境,比率应从 2-8:1 增加到 4-16:1。

目录高速缓存还将在 SAP IQ 或 ASA 中主动运行查询的连接和用户数量。由于资源约束,目录高速缓存过大可能会导致性能不佳,甚至导致客户端错误。

在 SAP IQ 服务器中,通过考虑服务器高速缓存 (-c) 和活动请求数 (-gn) 来计算每个活动请求可用的目录高速缓存内存量。当连接发出请求且缓存使用情况超过该限制时,服务器将拒绝该请求,并显示错误“语句大小或复杂性超出服务器限制”。为了补偿这一点,可以在服务器启动时增加目录高速缓存量和/或减少活动请求的数量。

通常, -gn 由 SAP IQ 启动脚本隐式设置为 -gm * 1.5。当 -gm 设置为 100 时,-gn 的值将默认为 150。

应注意,某些类型的 SQL 可能会增加正在使用的目录缓存量。

给定一个返回结果集的存储过程:

create procedure sp_test()

begin

select * from my_table;

end;

SAP IQ 提供了两种返回数据的机制。您可以通过调用或执行直接执行该过程:

call sp_test();

也可以从存储过程中进行选择:

select * from sp_test();

第二个选项强制目录引擎处理和存储数据集。因此,用户可以使用的目录高速缓存量急剧增加。此外,必须使用的目录临时空间量可能会增加(缺省情况下,在 UNIX 上为 /tmp)。

建议对于典型的应用程序使用,不使用存储过程的第二种形式的返回数据(通过 SELECT),因为当简单执行过程的第一个示例完成相同的任务且没有任何开销时,它会给系统增加不必要的开销。

确定 请求使用的目录高速缓存量的最佳方法是从典型的生产日工作量中对其进行测量。可以监控某些连接和服务器属性以提供相应的统计信息。

  • UnschReq - 当前排队等待可用服务器线程的请求数

  • ActiveReq - 当前正在处理请求的服务器线程数

  • LockedHeapPages - 高速缓存中锁定的堆页数

  • CurrentCacheSize - 当前高速缓存大小(以千字节为单位)

  • PageSize - 数据库服务器高速缓存页的大小(以千字节为单位)(注意:这是目录页大小,而不是 SAP IQ 页大小)

    可根据缓存使用情况和活动请求数计算请求的平均缓存使用率,如下所示:

    PagesPerRequest = LockedHeapPages / ActiveReq

    可以使用 SQL Anywhere property() 函数查询这些属性。由于这些属性表示瞬时值,因此在评估工作负载以捕获最坏情况值时,需要经常查询它们。

    以下 SQL 将以 5 秒为间隔获取 100 个示例,并计算最大缓存使用率:

    begin
    

    declare c1 int;

    declare local temporary table #tmp1(ar bigint, lp bigint) in SYSTEM;

    set c1 = 0;

    lp: loop

    set c1 = c1 + 1;

    if c1 > 100 then

    leave lp

    end if;

    insert #tmp1 select property('ActiveReq'), property('LockedHeapPages');

    waitfor delay ’00:00:05’;

    end loop;

    select max(lp) as MaxLockedHeapPages,

    max(ar) as MaxActiveReq ,

    max(lp)/max(ar) as AvgPagesPerRequest

    from #tmp1;

    end;

    现在,可以使用高速缓存大小和请求大小计算可并发执行的最大请求数,如下所示:

    MaxActiveReq = CurrentCacheSizeKB / PageSizeKB / AvgPagesPerRequest

    假设当前高速缓存设置为 256 MB,目录页大小为 4 KB,每个请求的平均页数为 500,则并发活动请求的总数为:

    MaxActiveReq = ( 256 * 1024) / 4 / 500
    

    MaxActiveReq = 131.072 rounded down to 131