DirectQuery 模式(SSAS 表格)

借助于 Analysis Services,您可以通过使用“DirectQuery 模式”来创建直接从关系数据库系统检索数据和聚合的表格模型和报表。 对于 DirectQuery 模式,人们提及最多的好处包括可以查询无法在内存中容纳的很大的数据集以及可以实时刷新数据。

本主题介绍仅驻留在内存中的标准表格模型和可查询关系数据源的表格模型之间的差异,并且说明如何创建和部署要在 DirectQuery 模式下使用的模型。

本主题的内容:

  • DirectQuery 模式的概述

  • 创建模型以便在 DirectQuery 模式下使用

    • 用于 DirectQuery 模型的数据源

    • 针对 DirectQuery 模式的验证和设计限制

    • 公式兼容性

    • 连接到 DirectQuery 模型

    • 安全性

  • DirectQuery 属性

  • 相关主题和任务

DirectQuery 模式的概述

默认情况下,表格模型使用内存中缓存来存储和查询数据。 因为表格模型使用在内存中驻留的数据,所以,即使是复杂查询也可以非常快地执行。 但是,使用缓存数据存在以下缺点:

  • 在源数据发生变化时,数据不刷新。 您必须对模型进行处理,以便对数据进行更新。

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

相反,DirectQuery 模式中的表格模型使用在 SQL Server 数据库或 SQL Server PDW 数据仓库中存储的数据。 在设计时,您将所有数据或一小部分数据样本导入缓存并照常生成您的模型。 当您准备部署模型时,将操作模式更改为 DirectQuery。 更改操作模式后,针对该模型的任意查询将使用指定的关系数据源(SQL Server 或 SQL Server PDW)而非缓存的数据。

针对模型创建报表或查询时,您使用 DAX,但是 Analysis Services 会将 DAX 查询转换为针对指定关系数据源的等效 Transact-SQL 语句。

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

  • 可能存在这样的模型:其数据集过大以至于 Analysis Services 服务器上的内存无法容纳。

  • 数据确保是最新的,并且没有不得不维护数据的单独副本的额外管理开销。 对于基础数据源的更改可立即反映在针对数据模型的查询中。

  • DirectQuery 可以利用提供程序端的查询加速功能,例如,xVelocity 内存优化的列索引提供的加速功能。 xVelocity 列存储索引在 SQL Server 2012 和 SQL Server PDW 中均提供,以支持改进的 DirectQuery 性能。

  • 后端数据库采用的任何安全性也保证会被采用,并且使用行级安全性。 相反,如果您在使用缓存的数据,可能很难确保能够以在服务器上保护数据的相同方式来保护缓存的安全。

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

针对 DirectQuery 模式设计模型

所有表格模型均使用 SQL Server Data Tools (SSDT) 中的模型设计器创建,该设计器在默认情况下始终在内存中创建模型。 这意味着如果您使用的数据过大而无法在内存中容纳,应在设计时计划使用更小的数据子集并仅在部署模型后才访问完整数据源。 可以通过以下几种方法来使用数据的更小子集:

  • 使用表导入向导将数据添加到模型时,使用筛选器以仅将数据子集导入工作区数据库使用的缓存。 部署模型后,您可以编辑查询定义以删除或更改筛选器。

  • 使用临时数据源并在临时表仅包含数据子集时设计模型。

  • 将分区添加到您的表,以管理需要在任意时间一次处理的数据量。

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

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

  • **数据源:**DirectQuery 模型只能使用来自单个关系数据源的数据。 该源可以是 SQL Server 实例或 SQL Server PDW 实例。 在为模型启用了 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 查询语法参考

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

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

  • 在缓存和关系数据源都可用时,您可以设置首选连接方法,但最终客户端还是使用 DirectQueryMode 连接字符串属性来控制所使用的源。

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

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

用于 DirectQuery 模型的数据源

在您更改设计环境以便启用 DirectQuery 模式后,应立即对用于工作区数据库的数据源进行验证,以便确保它们来自单个关系数据源。 DirectQuery 模型中不允许来自其他数据源的数据,包括复制-粘贴的数据。

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

针对 DirectQuery 模式的验证和设计限制

当您为在 DirectQuery 模式下使用而创建模型时,最初必须将某些部分的数据加载到缓存中。 如果您最终使用的数据太大以致在内存中放不下,则可以在“表导入向导”中使用**“预览并筛选”**选项来选择某一数据子集,或者编写 SQL 脚本以便获取所需数据。 另一种方法是将数据子集临时存储到数据仓库,在完成设计阶段后增大数据存储区。

注意事项注意

因为 DirectQuery 模式不支持使用计算列,您必须删除所有计算列。 您可以将一些计算列转换为度量值,但是在其他情况下您可能需要在数据导入查询或脚本中生成派生列,或在关系数据源中添加它们。

若要查看和解决验证错误,请在 SQL Server Data Tools 中打开**“错误列表”。 导致无法使用 DirectQuery 模式的错误将会显示在“错误”**选项卡中。 在切换到 DirectQuery 模式之前必须修复这些错误。 比较难解决的验证错误通常与 DirectQuery 模式下不支持的公式相关。 有关与公式和计算列相关的错误的概述,请参阅以下部分:公式兼容性。

下表介绍了为 DirectQuery 访问创建模型时应注意的其他事项:

  • 处于“仅限 DirectQuery”模式下时,报表中的结果取决于正在查看结果的用户的安全上下文。 您应该使用不同的凭据对模型进行测试,以便确保用户得到预期结果。

  • 如果您将模型配置为在混合模式下操作以便允许使用缓存或来自关系源的数据,则应该了解,客户端可能会看到不同结果,具体取决于连接字符串中指定的模式。 如果您需要确保您的报表用户仅看到来自关系源的数据,则必须清除缓存或将模型更改为 DirectQueryOnly。

DirectQuery 模型的公式兼容性

某些模型可能包含在 DirectQuery 模式下不支持的公式,因此必须对模型进行重新设计,以便防止验证错误。 下面是对在 DirectQuery 模式下支持的公式的限制:

  • 在启用了 DirectQuery 模式的任何表格模型中均不支持计算列,甚至是在混合模型中也不支持。 如果您需要针对某一模型的计算列,则考虑通过在您的导入定义中使用 Transact-SQL,将这些计算列转换为派生列。

  • DirectQuery 模型支持在度量值中使用 DAX 公式,度量值将转换为针对关系数据存储区的基于集的操作。 还支持可通过使用隐式度量值创建的度量值。

  • 并非支持所有函数。 因为在查询 DirectQuery 模型时 Analysis Services 将所有 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 和控制用于针对模型的查询的数据源。

属性名称

说明

DirectQueryMode 属性

此属性在模型设计器中启用 DirectQuery 模式。 您必须将此属性设置为 On,才能更改任何其他 DirectQuery 属性。

有关详细信息,请参阅启用 DirectQuery 设计模式(SSAS 表格)

QueryMode 属性

此属性指定 DirectQuery 模型的默认查询方法。 您可以在部署模型时在模型设计器中设置此属性,但是以后可以覆盖它。

该属性具有以下值:

  • DirectQuery – 此设置指定针对模型的所有查询都应该仅使用关系数据源。

  • DirectQuery 以及内存中 – 指示默认情况下应该通过使用关系数据源来响应查询,除非在客户端的连接字符串中指定了其他项。

  • 内存中 - 指示应该仅通过使用缓存来响应查询。

  • 内存中以及 DirectQuery – 指示默认情况下应该通过使用缓存来响应查询,除非在客户端的连接字符串中指定了其他项。

有关详细信息,请参阅设置或更改 DirectQuery 的首选连接方法

DirectQueryMode 属性

在部署了模型后,您可以通过在 SQL Server Management Studio 中更改此属性,更改 DirectQuery 模型的首选查询数据源。

与以前的属性相似,此属性也指定模型的默认数据源并且具有以下值:

  • InMemory:查询只能使用缓存。

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

  • InMemorywithDirectQuery:查询默认使用缓存,除非在客户端的连接字符串中指定了其他项。

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

有关详细信息,请参阅设置或更改 DirectQuery 的首选连接方法

模拟设置属性

此属性定义用于在查询时连接到关系数据源的凭据。 您可以在模型设计器中设置此属性,并且可以在部署了模型后,在以后更改该属性值。

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

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

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

相关主题和任务

主题

说明

分区和 DirectQuery 模式(SSAS 表格)

说明如何在配置为 DirectQuery 模式的模型中使用分区。

DirectQuery 模式下的公式兼容性

说明可在配置为 DirectQuery 模式的模型中使用的公式的限制和兼容性要求。

启用 DirectQuery 设计模式(SSAS 表格)

说明如何更改设计时环境以便它支持使用 DirectQuery 模式。

更改 DirectQuery 分区(SSAS 表格)

说明如何更改 DirectQuery 分区。

设置或更改 DirectQuery 的首选连接方法

说明如何设置或更改配置为 DirectQuery 的模型的连接方法。

DirectQuery 部署方案(SSAS 表格)

说明 DirectQuery 部署方案。

为表格模型数据库配置内存中或 DirectQuery 访问权限

说明一些常见的 DirectQuery 配置。

清除 Analysis Services 缓存

说明如何清除表格模型的缓存。

请参阅

概念

分区(SSAS 表格)

表格模型项目(SSAS 表格)

在 Excel 中分析(SSAS 表格)