管理查询高速缓存

Oracle Analytics Cloud 在查询高速缓存中维护查询结果集的本地高速缓存。

主题:

关于查询高速缓存

通过使用查询高速缓存,Oracle Analytics Cloud 无需访问后端数据源即可满足许多后续查询请求,并且这可提高查询性能。但是,当后端数据源更新时,查询高速缓存条目可能会变为过时。

高速缓存的优势

处理查询的最快方式是跳过大部分处理,并使用预计算的应答。

使用查询高速缓存时,Oracle Analytics Cloud 将查询的预计算结果存储在本地高速缓存中。如果其他查询可以使用这些结果,则不必进行相应查询的所有数据库处理。这可以显著缩短平均查询响应时间。

除了提高性能外,能够从本地高速缓存应答查询还可节省网络资源以及减少在数据库服务器上的处理时间。能够节省网络资源是因为中间结果不返回到 Oracle Analytics Cloud。不在数据库上运行查询可释放数据库服务器以执行其他工作。如果数据库使用计费系统,则运行的查询减少还可能削减预算成本。

使用高速缓存应答查询的另一个优势是节省 Oracle Analytics Cloud 上的处理时间,尤其是从多个数据库检索查询结果时。根据查询的具体情况,可能会在服务器中进行大量联接和排序处理。如果已经计算了查询,则可避免此处理,从而释放服务器资源以执行其他任务。

概括地说,查询高速缓存可以显著提高查询性能,并且减少网络流量、数据库处理和处理开销。

高速缓存成本

查询高速缓存有很多明显的优势,但也有一些成本。

  • 高速缓存结果可能会过时

  • 存在高速缓存管理成本

进行高速缓存管理的优势通常远胜于成本。

与高速缓存关联的管理任务

一些管理任务与高速缓存关联。必须为每个物理表适当设置高速缓存持续时间,前提是知道表中数据的更新频率。

当更新频率变化时,您必须跟踪更改发生时间,并在需要时手动清除高速缓存。

使高速缓存保持最新

如果底层数据库中的数据更改时未清除高速缓存条目,则查询可能会返回过时的结果。

您必须评估这种情况是否可接受。也许可接受以允许高速缓存包含一些过时数据。您必须确定哪个级别的过时数据可接受,然后配置(和遵循)一组规则以反映这些级别。

例如,假定一个应用程序分析某个大型企业集团的公司数据,并且您要对公司的不同部门进行年度汇总。新数据不会实际影响查询,因为新数据仅影响下一年的汇总。在这种情况下,在权衡是否清除高速缓存时,可能倾向于保留高速缓存中的条目。

但是,假定数据库一天更新三次,并且您要对当天的活动执行查询。在这种情况下,必须清除高速缓存且清除频率要高得多,或者可能考虑根本不使用高速缓存。

另一种情况是定期(例如每周一次)从头开始重建数据集。在此示例中,可以在重建数据集的过程中清除整个高速缓存,从而确保高速缓存中绝不会有过时数据。

无论哪种情况,都必须评估向用户返回非当前信息时,哪些是可接受的。

在用户之间共享高速缓存

如果为特定连接池启用了共享登录,则可以在用户之间共享高速缓存,不需要为每个用户植入高速缓存。

如果未启用共享登录,并且使用特定于用户的数据库登录,则每个用户将生成自己的高速缓存条目。

启用或禁用查询高速缓存

在 Oracle Analytics Cloud 中,默认情况下启用查询高速缓存。可以在高级系统设置页上启用或禁用查询高速缓存。

  1. 单击控制台
  2. 单击高级系统设置
  3. 单击性能和兼容性
  4. 启用高速缓存设置为启用或禁用。
    • 启用 — 启用数据查询高速缓存。
    • 禁用 — 禁用高速缓存。
  5. 单击应用
    等待一段时间,以便在系统中刷新更改。

监视和管理高速缓存

要管理底层数据库中的更改以及监视高速缓存条目,必须制定高速缓存管理策略。

您需要在基础表中组成高速缓存条目的数据更改时使高速缓存条目失效的过程,以及监视、识别和删除任何不需要的高速缓存条目的过程。

本部分涵盖以下主题:

选择高速缓存管理策略

高速缓存管理策略选择取决于底层数据库中数据的易失性以及导致出现此易失性的更改的可预见性。

此外,还取决于构成高速缓存的查询的数量和类型以及使用这些查询的情况。本部分简要介绍了高速缓存管理的各种方法。

对系统禁用高速缓存

可以对整个系统禁用高速缓存,以停止生成所有新的高速缓存条目以及停止任何新查询使用现有高速缓存。如果禁用高速缓存,您可以在以后启用它,而不会丢失存储在高速缓存中的任何条目。

在以下情况下,临时禁用高速缓存很有用:您可能怀疑存在过时的高速缓存条目,但您想在清除这些条目或整个高速缓存之前确认它们是否确实是过时的。如果您发现高速缓存中存储的数据仍相关,或者在安全清除了问题条目后,可以安全地启用高速缓存。如果需要,可在重新启用高速缓存之前,清除整个高速缓存或与特定业务模型关联的高速缓存。

针对指定的物理表进行高速缓存以及设置高速缓存持续时间

您可以为每个物理表设置可高速缓存属性,以便您能够指定是否将针对相应表的查询添加到高速缓存以应答将来的查询。

如果为某个表启用高速缓存,则涉及该表的任何查询都添加到高速缓存。默认情况下,所有表都是可高速缓存的,但一些表可能不适合包含在高速缓存中,除非您设置合适的高速缓存持续时间设置。例如,假定您有一个表存储每分钟更新的股票行情数据。您可以指定每 59 秒清除一次该表的条目。

您还可以使用高速缓存持续时间设置来指定此表的条目在查询高速缓存中存储多长时间。这适用于频繁更新的数据源。

  1. 模型管理工具的物理层中,双击物理表。

    如果使用语义建模器,请参见 物理表的常规属性是什么?

  2. 物理表属性对话框的一般信息选项卡中,进行以下选择之一:

    • 要启用高速缓存,请选择可高速缓存

    • 要防止对表进行高速缓存,请取消选择可高速缓存

  3. 要设置高速缓存失效时间,请指定高速缓存持续时间,并指定单位(天、小时、分钟或秒)。如果不希望高速缓存条目自动失效,请选择高速缓存永不失效

  4. 单击确定

语义模型更改如何影响查询高速缓存

使用语义建模器或模型管理工具修改语义模型时,所做更改可能会对存储在高速缓存中的条目产生影响。例如,如果更改物理对象或动态语义模型变量的定义,则引用相应对象或变量的高速缓存条目可能不再有效。这些更改可能会导致需要清除高速缓存。要注意下面两种情况:修改现有语义模型时,创建(或上载)新语义模型时。

语义模型更改

修改语义模型或上载不同的 .rpd 文件时,如果所做的任何更改影响高速缓存条目,则会自动清除引用所更改对象的所有高速缓存条目。上载更改时会进行清除。例如,如果从语义模型中删除物理表,则会在检入时清除引用该表的所有高速缓存条目。在逻辑层对语义模型所做的任何更改都会导致清除该语义模型的所有高速缓存条目。

全局语义模型变量的更改

全局语义模型变量的值将由从查询返回的数据进行刷新。定义全局语义模型变量时,将创建初始化块或使用包含 SQL 查询的先前存在的初始化块。此外,还将配置运行查询和定期刷新变量值的调度。

如果全局语义模型变量值发生更改,则在列中使用此变量的任何高速缓存条目都将变为过时,再次需要相应条目中的数据时,将生成新的高速缓存条目。旧高速缓存条目不会立即删除,而是一直保留到通过常用高速缓存机制将其清除为止。

高速缓存使用策略

查询高速缓存的主要优势之一是显著提高查询性能。

使用查询高速缓存,可在非工作时间通过运行查询并缓存其结果来植入高速缓存。好的植入策略需要您知道何时发生高速缓存命中。

如果要为所有用户植入高速缓存,可使用以下查询植入高速缓存:

SELECT User, SRs

使用 SELECT User, SRs 植入高速缓存后,以下查询为高速缓存命中:

SELECT User, SRs WHERE user = valueof(nq_SESSION.USER) (and the user was USER1)
SELECT User, SRs WHERE user = valueof(nq_SESSION.USER) (and the user was USER2)
SELECT User, SRs WHERE user = valueof(nq_SESSION.USER) (and the user was USER3)

本部分涵盖以下主题:

关于高速缓存命中

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

高速缓存命中是指 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

在使用行级别数据库安全性时确保高速缓存结果正确

使用行级别数据库安全性策略(例如虚拟专用数据库 (Virtual Private Database, VPD))时,返回的数据结果取决于用户的授权身份证明。

因此,Oracle Analytics Cloud 必须知道数据源是否使用行级别数据库安全性以及哪些变量与安全性相关。

为了确保只有包含和匹配所有安全相关变量的高速缓存条目发生高速缓存命中,必须在模型管理工具中正确配置数据库对象和会话变量对象,如下所示:

  • 数据对象。在物理层中,在“数据库”对话框的“一般信息”选项卡中,选择虚拟专用数据库以指定数据源使用行级别数据库安全性。

    如果要将行级别数据库安全性与共享高速缓存结合使用,则必须选择此选项以阻止共享安全相关变量不匹配的高速缓存条目。

  • 会话变量对象。对于安全相关变量,在使用行级别数据库安全性策略时,在“会话变量”对话框中选择安全相关以将其标识为安全相关。此选项可确保使用安全相关变量标记高速缓存条目,从而对所有传入查询启用安全相关变量匹配。

运行一组查询来填充高速缓存

要尽可能增加高速缓存命中,一个策略是运行一组查询来填充高速缓存。

以下是有关在创建一组用于植入高速缓存的查询时要使用的查询类型的一些建议。

  • 常用预构建查询。通常运行的查询(尤其是处理成本较高的查询)是非常好的高速缓存植入查询。例如,其结果嵌入仪表盘的查询是很好的常用查询。

  • 无表达式的 SELECT 列表。清除 SELECT 列表列中的表达式可增加高速缓存命中的可能性。含表达式的高速缓存列只能应答使用相同表达式的新查询;不含表达式的高速缓存列可以应答使用任何表达式针对该列发出的请求。例如,下面这种高速缓存请求:

    SELECT QUANTITY, REVENUE...
    

    可以应答下面这种新查询:

    SELECT QUANTITY/REVENUE... 
    

    但相反则不行。

  • 无 WHERE 子句。如果高速缓存结果中没有 WHERE 子句,则可以使用它来应答符合含任何 WHERE 子句(包含投影列表中的列)的 select 列表的高速缓存命中规则的查询。

通常,最适合用来植入高速缓存的查询是大量使用数据库处理资源以及可能要重新发出的查询。注意不要使用返回许多行的简单查询来植入高速缓存。这些查询(例如 SELECT * FROM PRODUCTS,其中 PRODUCTS 直接映射到单个数据库表)需要的数据库处理非常少。它们的费用是网络和磁盘开销,而高速缓存无法降低这些开销。

Oracle Analytics Cloud 刷新语义模型变量时,将会检查业务模型以确定其是否引用这些语义模型变量。如果引用,Oracle Analytics Cloud 会为这些业务模型清除所有高速缓存。请参见语义模型更改如何影响查询高速缓存

使用代理植入查询高速缓存

可以配置代理以植入 Oracle Analytics Cloud 查询高速缓存。

植入高速缓存可缩短在用户运行分析或查看在其仪表盘上嵌入的分析时的响应时间。这可通过调度代理以运行刷新此数据的请求来实现。

  1. 在 Oracle Analytics Cloud 中,打开经典主页,然后选择代理创建部分)。
  2. 一般信息选项卡上,为运行身份选项选择收件人。个性化高速缓存植入使用每个收件人的数据可见性来为每个收件人定制代理传送内容。
  3. 调度选项卡上,指定要何时植入高速缓存。
  4. 可选: 选择条件,然后创建或选择条件请求。例如,您可能有一个确定 ETL 过程完成时间的业务模型。您可以使用基于此业务模型的报表作为开始高速缓存植入的条件触发器。
  5. 传送内容选项卡上,选择单个请求或要为其植入高速缓存的整个仪表盘页。选择仪表盘页可以节省时间。
  6. 收件人选项卡上,选择要作为收件人的单个用户或组。
  7. 目标选项卡上,清除所有用户目标,然后选择 Oracle Analytics Server 高速缓存
  8. 通过选择右上角的保存按钮来保存代理。

高速缓存植入代理与其他代理的唯一区别在于它们会自动清除以前的高速缓存,并且不会以预警形式显示在仪表盘上。

注:

高速缓存植入代理仅清除完全匹配查询,因此可能仍存在过时数据。确保高速缓存策略始终包含高速缓存清除,因为代理查询无法处理临时查询或钻探。

使用模型管理工具自动清除高速缓存中的特定表

清除高速缓存会从查询高速缓存中删除条目并使内容保持最新。可以自动清除高速缓存中特定表的条目,方法是在模型管理工具中为每个表设置高速缓存持续时间字段。

注:

如果使用语义建模器,请参见物理表的常规属性是什么?

这适用于频繁更新的数据源。例如,如果您有一个表存储每分钟更新的股票行情数据,您可以使用高速缓存持续时间设置来每 59 秒清除一次该表的条目。请参见针对指定的物理表进行高速缓存以及设置高速缓存持续时间