适用于: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;
符合结果集缓存的条件
发出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 数据仓库中的数据类型 - 查询包含
CAST或CONVERT,其中对日期或sql_variant数据类型有引用。 - 查询包含运行时常量(如
CURRENT_USER或GETDATE()) - 查询结果估计为 > 10,000 行
- 查询包含非确定性的内置函数、窗口聚合函数或排序函数,例如
PARTITION BY … ORDER BY。 请参阅 确定性和非确定性函数。 - 查询使用动态数据掩码、行级别安全性或其他 安全功能
- 查询使用 时间旅行
- 查询对输出中不包含的某个列或表达式应用 ORDER BY
- 在会话中,查询包含具有非默认值的会话级别语句(例如,将
SET设置为QUOTED_IDENTIFIER)OFF。 - 系统达到了缓存的内部限制。 在创建新缓存之前,后台缓存逐出进程将释放空间。
这些规则也适用于在同一查询的后续运行中重用缓存。 此外,在以下方案中可能不使用缓存:
- 自创建缓存以来对引用表所做的任何更改
- 创建缓存后,工作区已脱机,类似于 内存中缓存和磁盘缓存
- 用户没有足够的权限访问查询中的对象
- 该查询是通过不同的湖仓或仓库连接调用的,而不是在发出原始查询的地方。 (跨数据库查询不符合结果集缓存的条件。
- 查询使用与原始查询不同的输出列、列排序或别名
- 缓存查询在过去 24 小时内未被使用
注释
由于这些资格在内部被评估以用于结果集缓存的最佳应用,因此请务必记住,它们将来可能会更新。