关于高速缓存命中

启用了高速缓存时,会对每个查询进行评估以确定其是否符合高速缓存命中条件。

高速缓存命中是指 Oracle Analytics Cloud 能够使用高速缓存来应答查询,并且根本不访问数据库。Oracle Analytics Cloud 可以在相同或更高的聚合级别使用查询高速缓存来应答查询。

确定是否命中高速缓存的因素有许多。下表介绍这些因素。

因素或规则 说明

SELECT 列表中的部分列必须匹配

高速缓存查询中必须存在新查询的 SELECT 列表中的所有列,才符合高速缓存命中条件,或者必须能够从查询中的列计算它们。

此规则描述命中高速缓存的最低要求,但符合此规则并不保证实现高速缓存命中。此表中列出的其他规则也适用。

SELECT 列表中的列可以由高速缓存查询的列中的表达式组成。

Oracle Analytics Cloud 可以计算高速缓存结果中的表达式来应答新查询,但所有列必须在高速缓存结果中。例如,以下查询:

SELECT product, month, averageprice FROM sales WHERE year = 2000

命中以下查询的高速缓存:

SELECT product, month, dollars, unitsales FROM sales WHERE year = 2000

因为 averageprice 可从 dollarsunitsales 计算得到 (averageprice = dollars/unitsales)。

WHERE 子句必须在语义上相同或是逻辑子集

要使查询符合高速缓存命中条件,WHERE 子句约束条件必须等同于高速缓存结果或是高速缓存结果的子集。

如果一个 WHERE 子句是一个高速缓存查询的逻辑子集,并且该子集符合以下标准之一,则该子句符合高速缓存命中条件:

  • IN 列表值的子集。请求 IN 列表高速缓存查询的较少元素的查询符合高速缓存命中条件。例如,以下查询:

    SELECT employeename, region
    FROM employee, geography
    WHERE region in ('EAST', 'WEST')

    符合命中以下高速缓存查询的条件:

    SELECT employeename, region
    FROM employee, geography
    WHERE region in ('NORTH', 'SOUTH', 'EAST', 'WEST')
  • 它包含的 OR 约束条件比高速缓存结果少(但相同)。

  • 它包含文字比较的逻辑子集。例如,以下谓词:

    WHERE revenue < 1000

    符合命中含以下谓词的可比较查询的高速缓存条件:

    WHERE revenue < 5000
  • 没有 WHERE 子句。如果高速缓存了不含 WHERE 子句的查询,则符合所有其他高速缓存命中规则的查询符合高速缓存命中条件,无论其 WHERE 子句为何。

此外,WHERE 子句中使用的列必须在投影列表中。例如,以下查询:

SELECT employeename
FROM employee, geography
WHERE region in ('EAST', 'WEST')

对于前面列表中的植入查询,不会出现高速缓存命中,因为 REGION 不在投影列表中。

仅限维的查询必须是完全匹配

如果查询是仅限维的查询,这意味着查询中不包含事实或度量,则仅高速缓存查询的投影列的完全匹配会命中查询。此行为可防止在一个维表有多个逻辑源时出现正错 (false positive)。

含特殊函数的查询必须是完全匹配

包含特殊函数(例如时间序列函数(AGOTODATEPERIODROLLING)、限制和偏移函数(OFFSETFETCH)、关系函数(ISANCESTORISLEAFISROOTISSIBLING)、外部聚合函数以及一般筛选度量的其他查询也必须是对应于高速缓存查询中的投影列的完全匹配。在这些情况下,筛选也必须是完全匹配。对于筛选度量,如果筛选度量可以重写为 WHERE 子句,则可以利用子集高速缓存。

逻辑表集必须匹配

要符合高速缓存命中条件,所有传入查询必须与高速缓存条目具有相同的逻辑表集。此规则可避免出现假的高速缓存命中。例如,SELECT * FROM productSELECT * FROM product, sales 不匹配。

会话变量值必须匹配(包括安全会话变量)

如果逻辑 SQL 或物理 SQL 语句引用任何会话变量,则会话变量值必须匹配。否则,不会命中高速缓存。

此外,与安全相关的会话变量值必须匹配在语义模型中定义的安全会话变量值,即使逻辑 SQL 语句本身不引用会话变量也是如此。请参见在使用行级别数据库安全性时确保高速缓存结果正确

等效的联接条件

执行新查询请求生成的联接逻辑表必须与高速缓存结果(或部分高速缓存结果)相同,才能符合高速缓存命中条件。

DISTINCT 属性必须相同

如果高速缓存查询使用 DISTINCT 处理(例如 SELECT DISTINCT...)清除重复记录,则对高速缓存列的请求也必须包含 DISTINCT 处理;如果对相同列的请求不含 DISTINCT 处理,则结果为高速缓存未命中。

查询必须包含兼容的聚合级别

请求聚合级别信息的查询可以在较低聚合级别使用高速缓存结果。例如,以下查询请求在供应商、区域和城市级别销售的数量:

SELECT supplier, region, city, qtysold
FROM suppliercity

以下查询请求在城市级别销售的数量:

SELECT city, qtysold
FROM suppliercity

执行第二个查询时会命中第一个查询的高速缓存。

有限制性的其他聚合

例如,如果高速缓存含列 qtysold 的查询,则对 RANK(qtysold) 的请求的结果为高速缓存未命中。此外,在国家/地区级别请求 qtysold 的查询可以从在国家/地区、区域级别请求 qtysold 的查询获取高速缓存命中。

ORDER BY 子句必须由 select 列表中的列组成

如果查询按不包含在 select 列表中的列排序,则结果为高速缓存未命中。

诊断高速缓存命中行为

为了更好地评估高速缓存命中行为,应将 ENABLE_CACHE_DIAGNOSTICS 会话变量设置为 4,如下例所示:

ENABLE_CACHE_DIAGNOSTICS=4