DirectQuery 模式 (SSAS 表格)

Analysis Services 允许使用 DirectQuery 模式直接从关系数据库系统检索数据和聚合,从表格模型检索数据和创建报表。 本主题介绍仅驻留在内存中的标准表格模型和表格模型之间的差异,这些模型可以查询关系数据源,并说明如何创作和部署用于 DirectQuery 模式的模型。

本主题中的部分:

DirectQuery 模式的优点

默认情况下,表格模型使用内存中缓存来存储和查询数据。 由于表格模型使用驻留在内存中的数据,因此即使是复杂的查询也非常快。 但是,使用缓存数据有一些缺点:

  • 源数据更改时不会刷新数据。 必须处理模型才能获取数据的更新。

  • 关闭托管模型的计算机时,缓存将保存到磁盘,并且必须在加载模型或打开 PowerPivot 文件时重新打开。 保存和加载操作可能很耗时。

相比之下,DirectQuery 模式使用存储在 SQL Server 数据库中的数据。 通常,在创作模型时将所有数据或小样本导入缓存中,并在部署模型时指定针对模型的查询数据源应为 SQL Server,而不是缓存的数据。 Analysis Services 会将对数据的任何 DAX 查询转换为针对指定关系数据源的等效 SQL 语句。

使用 DirectQuery 模式部署模型有很多优点:

  • 可以通过数据集创建模型,这些数据集太大而无法容纳 Analysis Services 服务器上的内存。

  • 数据保证为 up-to日期,并且无需维护数据单独副本的额外管理开销。 对基础源数据的更改可以立即反映在针对数据模型的查询中。

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

  • 后端数据库强制实施的任何安全性都保证使用行级别安全性强制执行。 相比之下,如果使用缓存的数据,则很难确保缓存与服务器上的完全一样受到保护。

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

创作用于 DirectQuery 模式的模型

表格模型是使用模型设计器 SQL Server Data Tools (SSDT)创作的。 模型设计器在内存中创建所有模型,这意味着在建模时,如果数据太大而无法容纳到内存中,则应仅将一部分数据导入工作区数据库使用的缓存中。

准备好切换到 DirectQuery 模式时,可以更改启用 DirectQuery 模式的属性。 有关详细信息,请参阅“启用 DirectQuery 设计模式”(SSAS 表格)。

执行此作时,模型设计器会自动将工作区数据库配置为在混合模式下运行,使你能够继续使用缓存的数据。 模型设计师还会通知您模型中与 DirectQuery 模式不兼容的任何功能。 以下列表总结了要记住的主要要求:

  • 数据源: DirectQuery 模型只能使用来自单个 SQL Server 数据源的数据。 为模型启用 DirectQuery 模式后,在模型设计器中不能使用其他类型的数据,包括通过复制粘贴作添加的表。 将禁用所有其他导入选项。 查询中包含的任何表都必须是 SQL Server 数据源的一部分。 有关详细信息 ,请参阅 DirectQuery 模型的数据源

  • 支持计算列: DirectQuery 模型不支持计算列。 但是,您可以创建度量和关键绩效指标(KPI),用于对数据集进行分析。 有关详细信息,请参阅 有关验证 的部分。

  • DAX 函数的使用有限: 某些 DAX 函数不能在 DirectQuery 模式下使用,因此必须将它们替换为其他函数,或者使用数据源中的派生列创建值。 模型设计器为创建与 DirectQuery 模式不兼容的公式时出现的任何错误提供设计时验证。 有关详细信息,请参阅以下部分: 验证

  • 公式兼容性: 在某些情况下,与仅使用关系数据存储的 DirectQuery 模型相比,同一公式可以在缓存或混合模型中返回不同的结果。 这些差异是 xVelocity 内存中分析(VertiPaq)引擎和 SQL Server 之间的语义差异的结果。 有关这些差异的详细信息,请参阅此部分: 公式兼容性

  • 安全: 可以使用不同的方法来保护模型,具体取决于模型的部署方式。 使用 Analysis Services 实例的安全模型来保护表格模型的缓存数据。 DirectQuery 模型可以使用角色进行保护,但也可以使用关系数据存储中定义的安全性。 可以配置模型,以便基于仅限 DirectQuery 的模型打开报表的用户只能在其 SQL Server 中的权限下查看允许其访问的数据。 有关详细信息,请参阅此部分: 安全性

  • 客户端限制: 当模型处于 DirectQuery 模式时,只能使用 DAX 对其进行查询。 不能使用 MDX 创建查询。 这意味着不能使用 Excel 透视客户端,因为 Excel 使用 MDX。

    但是,如果将 DAX 表查询用作 XMLA Execute 语句的一部分,则可以在 SQL Server Management Studio 中针对 DirectQuery 模型创建查询,有关详细信息,请参阅 [DAX 查询语法参考](/dax/dax-syntax-reference)

解决所有设计问题并测试模型后,即可进行部署。 此时,可以设置用于针对模型应答查询的首选方法。 是否希望用户有权访问缓存,还是始终仅使用关系数据源?

如果在 混合模式下部署模型,缓存仍可用,可用于查询。 混合模式提供许多选项:

  • 当缓存和关系数据源都可用时,可以使用 DirectQueryMode 连接字符串属性设置首选连接方法,但最终客户端控制使用哪个源。

  • 还可以在缓存上配置分区,这样,就永远不会处理用于 DirectQuery 模式的主分区,并且必须始终引用关系源。 有多种方法可以使用分区来优化模型设计和报告体验。 有关详细信息,请参阅分区和 DirectQuery 模式(SSAS 表格)。

  • 部署模型后,可以更改首选连接方法。 例如,可以使用混合模式进行测试,并且仅在彻底测试使用该模型的任何报表或查询后,才将模型切换到 仅 DirectQuery 模式。 有关详细信息,请参阅 “设置或更改 DirectQuery 的首选连接方法”。

DirectQuery 模型的数据源

更改设计环境以启用 DirectQuery 模式后,将验证工作区数据库的数据源,以确保它们来自单个 SQL Server 数据源。 DirectQuery 模型中不允许来自其他源的数据,包括复制粘贴的数据。

如果打算在 DirectQuery 模式下使用该模型,必须确保报告所需的所有数据都存储在指定的 SQL Server 数据库中。 如果需要建模的数据在该源中不可用,请考虑使用 Integration Services 或其他数据仓库工具将数据导入 SQL Server 数据库,该数据库充当 DirectQuery 数据源。

DirectQuery 模式的验证和设计限制

在创作要在 DirectQuery 模式下使用的模型时,必须先将部分数据加载到缓存中。 如果最终使用的数据太大而无法容纳到内存中,则可以使用表导入向导中的 “预览和筛选 ”选项选择一部分数据,或编写 SQL 脚本来获取所需的数据。

警告

由于 DirectQuery 模式不支持使用计算列,因此,如果存在要合并或执行其他作的列,则应提前计划并将列定义创建为数据导入查询或脚本的一部分。

若要查看和解决验证错误,请在 SQL Server Data Tools 中打开 错误列表 。 阻止使用 DirectQuery 模式的关键错误显示在“ 错误 ”选项卡上。在更改为 DirectQuery 模式之前,必须修复这些错误。 难以解决的验证错误通常与 DirectQuery 模式下不支持的公式相关。 有关与公式和计算列相关的错误概述,请参阅 公式兼容性部分。

以下列表介绍了为 DirectQuery 访问创作模型时要记住的其他注意事项:

  • 仅在 DirectQuery 模式下时,报表中的结果可能会因查看结果的用户的安全上下文而异。 应使用不同的凭据测试模型,以确保用户获得预期结果。

  • 如果将模型配置为在混合模式下运行,这允许使用 SQL Server 中的缓存或数据,则应注意连接到每个源的客户端可能会看到不同的结果,具体取决于连接字符串中指定的模式。 如果需要确保报表用户仅看到来自 SQL Server 的数据,则必须清除缓存或更改模型到 DirectQueryOnly。

DirectQuery 模型的公式兼容性

某些模型可能包含 DirectQuery 模式下不支持的公式,并且必须重新设计模型以防止验证错误。 DirectQuery 模式下支持的公式的限制包括:

  • 任何启用了 DirectQuery 模式的表格模型中都不支持计算列,甚至不支持混合模型。 如果需要模型的计算列,请考虑在导入定义中使用 Transact-SQL 将它们转换为派生列。

  • DirectQuery 模型支持在度量值中使用 DAX 公式,这些公式被转换为针对关系数据存储的集操作。 支持使用隐式度量值创建的所有度量值。

  • 并非所有函数都受支持。 由于 Analysis Services 在查询 DirectQuery 模型时将所有 DAX 公式和度量值定义转换为 SQL 语句,因此任何包含无法转换为 Transact-SQL 的元素的公式都会触发模型的验证错误。 例如,不支持时间智能函数。 即使支持的函数的行为也不同,例如统计函数。 有关兼容性问题的完整列表,请参阅 DirectQuery 模式下的公式兼容性

  • 模型中的某些公式可能会在将模型切换到 DirectQuery 模式时进行验证,但在针对缓存与关系数据存储执行时返回不同的结果。 这是因为针对缓存的计算使用 xVelocity 内存中分析 (VertiPaq) 引擎的语义,该引擎包含许多旨在模拟 Excel 行为的功能,而针对存储在关系数据存储中的数据的查询必然使用 SQL Server 的语义。 有关在模型部署到实时时可能返回不同结果的 DAX 函数的列表,请参阅 DirectQuery 模式下的公式兼容性

连接到 DirectQuery 模型

使用 MDX 作为查询语言的客户端无法连接到使用 DirectQuery 模式的模型。 例如,如果你尝试在 DirectQuery 模型上创建 MDX 查询,将收到一个错误信息,指示多维数据集找不到或尚未被处理。 可以使用 Power View、DAX 公式或 XMLA 查询针对 DirectQuery 模型创建查询。 有关如何对表格模型执行即席查询的详细信息,请参阅 表格模型数据访问

如果使用混合模型,可以通过指定连接字符串属性 DirectQueryMode 来指定用户是连接到缓存还是使用 DirectQuery 数据。

DirectQuery 模式下的安全性

在模型创作过程中,指定用于检索源数据的权限。 这通常指的是您自己的凭据或用于开发的帐户。 但是,将模型切换为使用 DirectQuery 模式时,安全上下文更为复杂:

  • 请考虑用户是否具有对关系数据存储中的数据的必要访问级别。

  • 查看同一模型或报表的用户可能会看到不同的数据,具体取决于用户的安全上下文。

  • 如果已保留模型缓存,则使用 Analysis Services 安全模型(角色)保护缓存。 缓存可能包含模型设计器有权查看但用户不具有权限的数据。 模型和报表设计器应清除缓存,或者通过角色控制访问权限来保护此数据。

  • 从缓存中回答查询的模型在连接到数据源时无法模拟当前用户。 如果要在连接到数据源时模拟当前用户,则必须使用 DirectQuery 模式。

  • 如果报表模型需要安全性,有两个选项:可以使用 Analysis Services 角色,也可以对数据源设置行级权限。 关系数据源中的安全性用于控制对表的访问,不支持列级安全性。 因此,如果一个区域中的用户无权查看不同区域中的销售数据,则包含基于 Sales 表的度量值的报告将返回空白或错误。

用于设置模拟的属性指定在使用 DirectQuery 连接到模型时所使用的凭据,无论是仅使用 DirectQuery 的模型还是通过 DirectQuery 应答查询的混合模型。 本属性具有以下值:

默认
使用导入向导中指定的凭据连接到数据源。 这可以是特定的 Windows 用户或服务帐户。

ImpersonateCurrentUser
使用当前用户的凭据连接到数据源。

有关如何设置这些属性的信息,请参阅 DirectQuery 部署方案(SSAS 表格)。

DirectQuery 属性

下表列出了可以在 SQL Server Data Tools 和 SQL Server Management Studio 中设置的属性,以启用 DirectQuery 并控制用于针对模型的查询的数据源。

属性名称 DESCRIPTION
DirectQueryMode 属性 此属性允许在模型设计器中使用 DirectQuery 模式。 必须将此属性设置为On,才能更改任何其他 DirectQuery 属性。

有关详细信息,请参阅“启用 DirectQuery 设计模式”(SSAS 表格)。
QueryMode 属性 此属性指定 DirectQuery 模型的默认查询方法,在部署模型时在模型设计器中设置此属性,但稍后可以重写它。 该属性具有以下值:

DirectQuery - 此设置指定模型的所有查询应仅使用关系数据源。

具有内存中的 DirectQuery - 此设置默认使用关系源来应答查询,除非在客户端的连接字符串中另有指定。

内存中 - 此设置指定应仅使用缓存来应答查询。

In-Memory 与 DirectQuery - 默认情况下,此设置作出指定。 除非在客户端的连接字符串中另有指定,否则应使用缓存来回答查询。



有关详细信息,请参阅 “设置或更改 DirectQuery 的首选连接方法”。
DirectQueryMode 属性 部署模型后,可以通过在 SQL Server Management Studio 中更改此属性来更改 DirectQuery 模型的首选查询数据源

与上一个属性一样,此属性指定模型的默认数据源,并具有以下值:

InMemory:查询只能使用缓存。

DirectQuerywithInMemory:查询默认使用关系数据源,除非在客户端的连接字符串中另有指定。

InMemorywithDirectQuery:查询默认使用缓存,除非在客户端的连接字符串中另有指定。

DirectQuery:查询仅使用关系数据源。



有关详细信息,请参阅 “设置或更改 DirectQuery 的首选连接方法”。
模拟设置属性 此属性定义用于在查询时连接到 SQL Server 数据源的凭据。 可以在模型设计器中设置此属性,并在部署模型后稍后更改该值。

请注意,这些凭据仅用于回答针对关系数据存储的查询;它们与用于处理混合模型的缓存的凭据不同。

在模型仅限于内存使用时,不能使用模拟。 除非模型使用 DirectQuery 模式,否则设置 ImpersonateCurrentUser无效。

此外,如果模型包含分区,则必须选择一个分区作为 DirectQuery 模式下查询的源。 有关详细信息,请参阅分区和 DirectQuery 模式(SSAS 表格)。

主题 DESCRIPTION
分区和 DirectQuery 模式 (SSAS 表格) 描述如何在为 DirectQuery 模式配置的模型中使用分区。
DirectQuery 模式下的 DAX 公式兼容性 介绍可在为 DirectQuery 模式配置的模型中使用的公式的限制和兼容性要求。
启用 DirectQuery 设计模式(SSAS 表格) 介绍如何更改设计时环境,使其支持使用 DirectQuery 模式
更改 DirectQuery 分区(SSAS 表格) 介绍如何更改 DirectQuery 分区。
设置或更改 DirectQuery 的首选连接方法 介绍如何为 DirectQuery 配置的模型设置或更改连接方法。
DirectQuery 部署方案 (SSAS 表格) 介绍 DirectQuery 部署方案。
为表格模型数据库配置 In-Memory 或 DirectQuery 访问 了解 DirectQuery 配置
清除 Analysis Services 缓存 清除表格模型的缓存

另请参阅

分区 (SSAS 表格)
表格模型项目 (SSAS 表格)
在 Excel 中分析 (SSAS 表格)