结果集缓存(预览版)

适用于:SQL 分析终结点和 Microsoft Fabric 中的数据仓库

结果集缓存(预览版)是 Fabric 数据仓库和 Lakehouse SQL 分析终结点的内置性能优化,可提高读取延迟。

结果集缓存的工作原理是通过持久化适用的 SELECT T-SQL 查询的最终结果集,从而使后续运行命中缓存时只需处理最终结果集。 这可以绕过原始查询的复杂编译和数据处理,并更快地返回后续查询。

数据仓库方案通常涉及分析查询,这些查询处理大量数据以生成相对较小的结果。 例如, SELECT 查询如果包含多个连接并对数百万行数据执行读取和重新排序,可能会导致聚合结果仅有几行。 对于涉及报告或仪表板等任务的工作负载,这些任务往往会不断重复地触发相同的分析查询和相同的繁重计算,尽管最终结果仍保持不变。 结果集缓存可提高此情况和类似方案的性能,成本大致相同。

重要

此功能目前为预览版

自动管理缓存

结果集缓存以透明方式工作。 启用后,缓存的创建和重用会以机会方式应用于查询。

结果集缓存适用于仓库表上的 T-SQL 查询、指向 OneLake 源的快捷方式,以及指向非 Azure 源的快捷方式。 自动处理缓存管理,并根据需要定期逐出缓存。

此外,随着数据的变化,通过使之前创建的缓存失效来确保结果一致性。

配置结果集缓存

结果集缓存在项目层面是可配置的。

启用后,可以在项级别或单个查询(如果需要)禁用它。

在预览期间,所有项的结果集缓存默认处于关闭状态。

项目级配置

使用 ALTER DATABASE SET T-SQL 命令为 Lakehouse 或仓库启用结果集缓存。 使用 Lakehouse 的 SQL 分析终结点连接和运行 T-SQL 查询。

ALTER DATABASE <Fabric_item_name>
SET RESULT_SET_CACHING ON;

可以在 sys.databases 中检查设置值,例如,查看 Fabric Warehouse 或 Lakehouse SQL 分析终结点中当前上下文的值:

SELECT name, is_result_set_caching_on 
FROM sys.databases
WHERE database_id = db_id();

若要禁用结果集缓存,请执行:

ALTER DATABASE <Fabric_item_name>
SET RESULT_SET_CACHING OFF;

查询级配置

在项上启用结果集缓存后,可以针对单个查询禁用该缓存。

这对于调试或 A/B 测试查询非常有用。 通过在以下末尾附加此提示 SELECT来禁用查询的结果集缓存:

OPTION ( USE HINT ('DISABLE_RESULT_SET_CACHE') );

检查结果集缓存使用情况

可以在两个位置检查结果集缓存使用情况:消息输出和 queryinsights.exec_requests_history 系统视图。

在查询的消息输出中(在 Fabric 查询编辑器或 SQL Server Management Studio 中可见),如果查询能够使用现有结果集缓存,则查询执行后将显示语句“已使用结果集缓存”。

查询结果的屏幕截图,其中显示了使用了结果集缓存。

queryinsights.exec_requests_history中,该列 result_cache_hit 显示一个值,该值指示每个查询执行的结果集缓存使用情况:

  • 2:查询使用了结果集缓存(缓存命中
  • 1:查询创建了结果集缓存
  • 0:查询不适用于结果集缓存创建或使用情况

例如:

SELECT result_cache_hit, command, *
FROM queryinsights.exec_requests_history
ORDER BY submit_time DESC;

Fabric 查询编辑器中的屏幕截图,其中显示了queryinsights.exec_requests_history视图上的查询。

符合结果集缓存的条件

发出SELECT查询时,会评估其是否适合结果集缓存。 必须满足各种要求才能创建和使用结果集缓存。 其中一些帮助使缓存存储保持在内部限制之下,一些帮助保留复杂查询的缓存,而另一些帮助在重复的“命中”时保持结果正确性。 一个明显的示例是通过 SELECT 限制 GETDATE() 查询,从而不缓存其结果,但还有其他一些细微差别的情况,Fabric 会根据具体条件决定不缓存结果。

以下列表包含构造数据仓库中结果集缓存的常见取消资格。 如果发现查询不适用于创建结果集缓存,原因可能是以下一个或多个原因:

  • 结果集缓存未在当前连接的项上启用,或者未在项上启用,但查询包含 DISABLE_RESULT_SET_CACHE 提示
  • 查询不是纯粹的SELECT,例如CREATE TABLE AS SELECT(CTAS)和SELECT-INTO及其他数据修改语言。
  • 查询引用系统对象、临时表、元数据函数或未引用任何分布式对象
  • 查询没有引用至少一个包含 100,000 行的表
  • 查询引用当前连接的 Fabric 项之外的对象(例如跨数据库查询)
  • 查询位于显式事务或 WHILE 循环中
  • 查询输出包含不支持的数据类型和/或 VARCHAR(MAX) 数据类型和/或 VARBINARY(MAX) 数据类型。 有关支持的数据类型,请参阅 Fabric 数据仓库中的数据类型
  • 查询包含CASTCONVERT,其中对日期sql_variant数据类型有引用。
  • 查询包含运行时常量(如 CURRENT_USERGETDATE()
  • 查询结果估计为 > 10,000 行
  • 查询包含非确定性的内置函数、窗口聚合函数或排序函数,例如 PARTITION BY … ORDER BY。 请参阅 确定性和非确定性函数
  • 查询使用动态数据掩码、行级别安全性或其他 安全功能
  • 查询使用 时间旅行
  • 查询对输出中不包含的某个列或表达式应用 ORDER BY
  • 在会话中,查询包含具有非默认值的会话级别语句(例如,将SET设置为QUOTED_IDENTIFIEROFF
  • 系统达到了缓存的内部限制。 在创建新缓存之前,后台缓存逐出进程将释放空间。

这些规则也适用于在同一查询的后续运行中重用缓存。 此外,在以下方案中可能不使用缓存:

  • 自创建缓存以来对引用表所做的任何更改
  • 创建缓存后,工作区已脱机,类似于 内存中缓存和磁盘缓存
  • 用户没有足够的权限访问查询中的对象
  • 该查询是通过不同的湖仓或仓库连接调用的,而不是在发出原始查询的地方。 (跨数据库查询不符合结果集缓存的条件。
  • 查询使用与原始查询不同的输出列、列排序或别名
  • 缓存查询在过去 24 小时内未被使用

注释

由于这些资格在内部被评估以用于结果集缓存的最佳应用,因此请务必记住,它们将来可能会更新。