如何使用 OLAP Server 执行 SQL Server 分布式查询

本文介绍如何使用 OLAP Server 执行 SQL Server 分布式查询。

原始产品版本:SQL Server
原始 KB 数: 218592

总结

本文介绍如何执行 SQL Server 分布式查询,以从 OLAP Services(或 Analysis Services)多维数据集检索数据。 使用 Microsoft SQL Server,可以对 OLE DB 提供程序执行查询。 为此,可以使用下列方法之一:

  • OPENQUERY使用或 OPENROWSET Transact-SQL 函数。
  • 使用包含四部分名称的查询,包括链接服务器名称。

例如:

sp_addlinkedserver 'mylinkedserver', 'product_name', 'myoledbprovider', 'data_source','location', 'provider_string', 'catalog'
SELECT *
FROM OPENQUERY(mylinkedserver, 'select * from table1')

可以使用 OPENROWSET SQL Server SELECT 语句中的函数OPENQUERY将查询传递给链接的 OLAP 服务器。 查询仅限于 OLAP Services 支持的缩写 SELECT 语法;但是,查询可以包含多维表达式 (MDX) 语法。 包含 MDX 的查询返回 平展行集 ,如 OLE DB 文档中所述。 有关 SQL Server OLAP Services 支持的语法的详细信息 SELECT ,请参阅 OLAP Services 联机丛书中支持的 SQL SELECT 语法 主题。

若要从 SQL Server 查询本地或远程 OLAP 服务器数据库,必须在运行 SQL Server 的计算机上安装 MSOLAP OLE DB 访问接口。 从 SQL Server 安装 OLAP 客户端组件时,会安装 MSOLAP OLE DB 访问接口。

OPENROWSET 和 OPENQUERY 示例

以下 Transact-SQL 代码示例演示如何通过 OLAP 服务器 OPENQUERY 设置和使用分布式查询以及函数 OpenRowset 。 必须根据需要更改数据源名称和目录名称。

------------------------------------------
--OPENROWSET for OLAP Server
------------------------------------------

SELECT a.*
FROM OpenRowset('MSOLAP','DATASOURCE=myOlapServer; Initial Catalog=FoodMart;',
'SELECT Measures.members ON ROWS,
[Product Category].members ON COLUMNS
FROM [Sales]') as a
go

-- Example of MDX with slicing --

SELECT a.*
FROM OpenRowset('MSOLAP','DATASOURCE=myOlapServer; Initial Catalog=FoodMart;',
'SELECT
 { Time.Year.[1997] } ON COLUMNS,
NON EMPTY Store.MEMBERS ON ROWS
FROM Sales
WHERE ( Product.[Product Category].[Dairy] )') as a

--------------------------------------------------
-- Linked Server Examples with OPENQUERY
--------------------------------------------------

EXEC sp_addlinkedserver
    @server='olap_server',
    @srvproduct='',
    @provider='MSOLAP',
    @datasrc='server',
    @catalog='foodmart'

go

-- MDX in OPENQUERY --

SELECT *
FROM OPENQUERY(olap_server,
'SELECT
{ Time.Year.[1997] } ON COLUMNS,
NON EMPTY Store.MEMBERS ON ROWS
FROM Sales
WHERE ( Product.[Product Category].[Dairy])' )

注意

OLAP Services 联机丛书中,将查询从 SQL Server 传递到链接的 OLAP Server 主题包含代码示例中的文档 bug:

SELECT *
FROM OPENQUERY(olap_server, 'SELECT [customer], [quantity] FROM sales')

仅支持有限形式的 SQL,只能指定级别或度量值名称。 运行查询时,会收到以下错误消息:

服务器:Msg 7399、级别 16、状态 1、第 1 行 OLE DB 提供程序“MSOLAP”报告了错误。 [OLE/DB 提供程序返回的消息: 列名“customer”无效。 只能指定级别或度量值名称。]

修复查询的一种方法是使用以下方法:

SELECT *
FROM OPENQUERY(olap_server, 'SELECT [unit sales] FROM sales')

但是,以该形式将 SQL 语句传递到 OLAP 服务器可能很慢,在某些计算机上可能会收到超时错误:

OLE DB 访问接口“MSOLAP”报告了错误。 [OLE/DB 提供程序返回的消息:无法打开数据库“foodmart”][OLE/DB 提供程序返回消息:OLAP 服务器错误:由于超时,请求的操作失败。]

包含四部分名称的链接服务器示例

本节中的 Transact-SQL 代码示例演示如何使用包含四部分名称的链接服务器来查询 OLAP 多维数据集。 在代码中,在前面的示例中创建了命名 Olap_server 的链接服务器:

Select [Store:Store Name]
from Olap_server.FoodMart..[sales]
WHERE [Store:Store State]='WA'
go
Select [Product:Product Category], count ([Store:Store Name])
from Olap_server.FoodMart..[sales]
WHERE [Store:Store State]='WA'
GROUP BY [Product:Product Category]

尽管具有四部分名称的链接服务器示例可以正常工作,但它们可能需要很长时间才能将结果返回到客户端。 四部分名称语法是 SQL Server 概念;它用于 Transact-SQL 命令来引用链接服务器中的表,并且对 OLAP 查询的语法有限。 SQL Server 可能会确定它必须从 OLAP Server 读取整个事实数据表并执行 GROUP BY 自身,这可能需要大量的资源和时间。

Microsoft建议通过 OPENROWSETOPENQUERY 函数发送 MDX 语句,如前面的示例所示。 此方法允许 SQL Server 将命令直接发送到链接的 OLAP 提供程序,而无需尝试分析它。 该命令可以是 MDX,也可以是 OLAP 提供程序支持的 SQL 子集。 可以使用从其他 SQL 运算符中的函数返回的 OPENQUERY 行集。 对于返回相对较少的数据(如屏幕)的基本 MDX 查询和 GROUP BY 查询,结果集必须始终在不到 10 秒内创建,通常为 5 秒,而不考虑多维数据集的大小。 如果查询需要更长的时间,则可以使用基于使用情况的分析向导生成更多聚合。

性能提示

下面是一些性能提示:

  • SQL Server 为每个查询打开与 OLAP 提供程序的两个连接。 其中一个用于后续查询:因此,如果再次运行该命令,则第二个查询的运行速度可能会更快。

  • 若要提高速度,请按另一个维度分组(因为数据较少)。

  • 最糟糕的情况是多维数据集通过关系 OLAP (ROLAP) 存储,并且没有聚合。 然后,OLAP 服务器将打开与 SQL Server 的连接,以获取事实数据表行。 在这种情况下,请勿使用 SQL Server 分布式查询。

  • 如果只需要来自 OLAP 服务器或多维数据集文件的结果集,请尝试使用 OLE DB C++ 应用程序或 ADO(ADO*MD) 应用程序,直接对 OLAP 服务器或任何多维数据集文件运行 SQL Server 或多维查询。

  • SQL Server 安装一些 OLE DB 提供程序,并将这些提供程序配置为加载进程内。 由于 SQL Server 未安装 MSOLAP 提供程序,因此它配置为加载进程外。 Microsoft强烈建议更改 OLAP 提供程序作为进程内加载的选项,因为此配置可提高 OLAP 查询的性能。 若要进行更改,请执行以下步骤:

    1. 在“安全” 文件夹中,右键单击“链接服务器”,然后单击“ 新建链接服务器”。
    2. 对于提供程序名称,单击以选择 OLE DB Provider for OLAP Services
    3. 单击“选项”。
    4. 单击以选择 “允许 InProcess”。
    5. 单击“确定”。

参考

  • 有关存储过程参数的 sp_addlinkedserver 详细说明,请参阅 SQL Server 联机丛书。

  • 有关在 SQL Server 联机丛书中设置和使用分布式查询、搜索sp_addlinkedserverOPENQUERYOPENROWSET搜索和相关主题的更多详细信息。

  • 若要了解有关 OLAP 技术和 MDX 语法的详细信息,请参阅 OLAP Services 联机丛书。