表格模型中的 DirectQuery 模式

适用于: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

本文介绍 1200 及更高兼容级别的 Analysis Services 表格模型的 DirectQuery 模式 。 可以为在 Visual Studio 中设计的模型启用 DirectQuery 模式,或者为已部署的表格模型启用 DirectQuery 模式,可以使用 SQL Server Management Studio (SSMS) 更改为 DirectQuery 模式。 在选择 DirectQuery 模式之前,请务必了解其优点和限制。

好处

默认情况下,表格模型使用内存中缓存来存储和查询数据。 当表格模型查询内存中驻留的数据时,即使是复杂查询也可以非常快地执行。 但是,使用缓存数据存在一些限制,例如,非常大的数据集可能会超过可用内存,如果需要经常处理(刷新)内存中模型数据,可能需要过多的可用资源。

DirectQuery 克服了这些限制,同时还利用 RDBMS 功能提高了查询执行效率。 使用 DirectQuery:

  • 数据是最新的。 由于数据始终在数据源中查询,因此客户端报告应用程序始终会获取最新数据。

  • 无需在内存中缓存) 中维护数据 (的单独副本,这不会产生额外的管理开销。 无需处理 (刷新) 模型数据。 对于基础数据源的更改可立即反映在针对数据模型的查询中。

  • 数据集可以大于 Analysis Services 服务器资源的内存容量。

  • DirectQuery 可以利用提供程序端查询加速,例如内存优化列索引提供的查询加速。

  • 后端源数据库可以通过使用数据库中的行级安全功能来强制实施安全性 (,也可以使用 DAX) 在模型中定义的行级安全规则。

  • 如果模型包含可能要求多个查询的复杂公式,则 Analysis Services 可以执行优化以便确保对后端数据库执行的查询的查询计划将尽可能高效。

限制

DirectQuery 模式下的表格模型有一些限制。 在切换模式前,务必确定在后端服务器上执行查询所带来的优势是否大于功能的减少。 如果在 Visual Studio 中更改现有模型的模式,表格模型设计器将通知你模型中与 DirectQuery 模式不兼容的任何功能。 请谨记以下限制:

功能 限制
数据源 DirectQuery 模型只能使用来自以下类型的单个关系数据库的数据:Azure SQL Database、Azure Synapse Analytics、SQL Server、Oracle 和 Teradata。
SQL 存储过程 对于 DirectQuery 模型,不能在 SQL 语句中指定存储过程来定义表。
计算表 DirectQuery 模型不支持计算表,但支持计算列。 如果你尝试转换一个包含计算表的表格模型,则将发生错误,指出该模型不能包含粘贴数据。
查询限制 默认行限制为 100 万行。 可以通过指定 MaxIntermediateRowSize 提高此限制。 若要了解详细信息,请参阅 DAX 属性
DAX 公式 在 DirectQuery 模式下查询表格模型时,Analysis Services 会将 DAX 公式和度量值定义转换为 SQL 语句。 所含元素不能转换为 SQL 语法的 DAX 公式将在模型上返回验证错误。

此限制主要限于某些 DAX 表函数。 对于度量值,DAX 公式将针对关系数据存储转换为基于集的操作。 这意味着将支持所有隐式创建的度量值。

发生验证错误时,必须重写公式,替换为其他函数,或通过使用数据源中的派生列来解决该问题。 如果表格模型包含包含不兼容函数的公式,则会在设计器中切换到 DirectQuery 模式时进行报告。

注意:将模型切换到 DirectQuery 模式时,模型中的某些公式可能会进行验证,但在针对缓存和关系数据存储执行时返回不同的结果。 这是因为针对缓存的计算使用内存中分析引擎的语义,该引擎包含用于模拟 Excel 行为的功能,而针对存储在关系数据源中的数据的查询使用 SQL 的语义。

公式一致性 在某些情况下,与仅使用关系数据存储的 DirectQuery 模型相比,相同的公式可能在缓存模型中返回不同的结果。 这些差异是内存中分析引擎和数据源之间的语义差异的结果。

MDX 限制 没有相对对象名称。 所有对象名称都必须是完全限定的。

没有会话范围 MDX 语句(命名集、计算成员、计算单元格、直观合计、默认成员等),但你可以使用查询范围构造,例如“WITH”子句。

MDX 再选择子句中没有包含不同级别成员的元组。

不要使用用户定义的层次结构。

没有本机 SQL 查询(通常,Analysis Services 支持 T-SQL 子集,但不适用于 DirectQuery 模型)。

连接到数据源

在 Visual Studio 中设计 DirectQuery 模型时,连接到数据源并选择要包含在模型中的表和字段与内存中模型大致相同。

如果已打开 DirectQuery 但尚未连接到数据源,则可以使用获取数据 (或旧提供程序数据源的数据导入向导) 连接到数据源、选择表和字段等。 其不同之处在于,在完成操作后,不会向内存中缓存实际导入任何数据。

DirectQuery 导入成功

如果已使用“获取数据”导入数据,但尚未打开 DirectQuery 模式,则会清除内存中缓存。

向 DirectQuery 模型项目添加示例数据

默认情况下,在 Visual Studio 中使用表格模型设计器 (SSDT) 设计 DirectQuery 表格模型项目时,模型的工作区数据库不包含任何数据。 每个表都有一个默认分区,此分区会将所有查询定向到数据源。 自 DirectQuery 首次引入以来,表格模型设计器在分区管理器中包括 “设置为示例” 功能。 此功能允许将复制分区添加到可用于将少量示例数据导入工作区数据库的表。 此功能旨在帮助验证建模决策,而不会影响数据源。

重要

目前,不支持表格模型设计器中的“设置为示例”功能。 忽略 Table <TableName> 不包含示例分区;若要在 SSDT 中使用数据,请添加示例分区 警告。

部署 DirectQuery 模型

DirectQuery 模型的部署与导入模型相同。 但是,与导入模型不同,如果 DirectQuery 模型包含计算项(如计算列或计算组),则部署后,必须对所有表执行 进程重新计算 。 若要了解详细信息,请参阅 处理数据库、表或分区

另请参阅

在 Visual Studio 中启用 DirectQuery 模式
在 SSMS 中启用 DirectQuery 模式
在 DirectQuery 模型中定义分区在 DirectQuery 模式下测试模型
Azure Analysis Services 中支持的数据源
SQL Server Analysis Services表格 1400 及更高模型支持的数据源