你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
启用结果集缓存后,专用 SQL 池会自动在用户数据库中缓存查询结果以供重复使用。 这样,后续查询执行即可直接从持久缓存获取结果,因此不需要重新计算。 结果集缓存可提高查询性能并减少计算资源使用率。 此外,使用缓存结果集的查询不使用任何并发槽,因此不会计入现有并发限制。 为了安全起因安全,用户只能访问缓存的结果,前提是他们拥有与创建缓存结果的用户相同的数据访问权限。 在默认情况下,数据库和会话级别的结果集缓存是关闭的。
注释
不应将结果集缓存与 DECRYPTBYKEY 结合使用。 如果必须使用此加密函数,请确保在执行时(在会话级别或数据库级别)禁用结果集缓存。
键盘命令
未缓存的内容
为数据库启用结果集缓存后,所有查询将缓存结果,直到缓存已满,但以下查询除外:
- 带有内置函数或运行时表达式的查询,这些表达式为非确定表达式,即使基表的数据或查询中没有更改也是如此。 例如,DateTime.Now()、GetDate()。
- 使用用户定义的函数的查询
- 使用具有行级别安全性的表的查询
- 返回数据行大小超过64KB的查询
- 返回数据量较大的查询(>10GB)
注释
- 某些非确定性函数和运行时表达式在对相同数据进行重复查询时可以表现出确定性。 例如,ROW_NUMBER()。
- 如果查询结果集中的行的顺序/序列对应用程序逻辑很重要,请在查询中使用 ORDER BY。
- 如果 ORDER BY 列中的数据不唯一,则与 ORDER BY 列中具有相同值的行没有保证的行顺序,无论结果集缓存是启用或禁用的。
重要
用于创建结果集缓存并从缓存中检索数据的操作发生在专用 SQL 池实例的控制节点上。 启用结果集缓存后,运行返回大型结果集(例如 >1GB)的查询可能会导致在控制节点上出现较高的流量限制,并降低实例上的整体查询响应速度。 这些查询通常在数据浏览或 ETL 操作过程中使用。 若要避免对控制节点造成压力并导致性能问题,用户应在运行此类查询之前关闭数据库的结果集缓存。
运行此查询以获取查询结果集缓存操作所用时间。
SELECT step_index, operation_type, location_type, status, total_elapsed_time, command
FROM sys.dm_pdw_request_steps
WHERE request_id = <'request_id'>;
下面是在禁用结果集缓存的情况下执行的查询的示例输出。
下面是在启用结果集缓存的情况下执行的查询的示例输出。
使用缓存结果时
如果满足以下所有要求,则会对查询重复使用缓存结果集:
- 运行查询的用户有权访问查询中引用的所有表。
- 新查询与生成结果集缓存的前一个查询之间存在完全匹配。
- 表中没有从中生成缓存结果集的数据或架构更改。
运行以下命令可以检查某个查询是否已执行并出现结果缓存命中或未命中情况。 result_cache_hit 列对缓存命中返回 1,对缓存失误返回 0,而对未使用结果集缓存的原因,则返回负值。 详情请查看 sys.dm_pdw_exec_requests。
SELECT request_id, command, result_cache_hit FROM sys.dm_pdw_exec_requests
WHERE request_id = <'Your_Query_Request_ID'>
管理缓存的结果
每个数据库的结果集缓存的最大大小为 1 TB。 当基础查询数据发生更改时,缓存的结果会自动失效。
缓存逐出由专用 SQL 池自动按照以下计划进行管理:
- 如果结果集未使用或已失效,则每 48 小时一次。
- 当结果集缓存接近最大大小时。
用户可以使用以下选项之一手动清空整个结果集缓存:
- 关闭数据库的结果集缓存功能
- 连接到数据库后运行 DBCC DROPRESULTSETCACHE
暂停数据库不会清空缓存的结果集。
后续步骤
有关更多开发技巧,请参阅 开发概述。