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

本文介绍如何使用 OLAP 服务器执行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')

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

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

OPENROWSET 和 OPENQUERY 示例

下面的 Transact-SQL 代码示例演示如何通过 和 函数设置和将分布式查询与 OLAP 服务器配合使用OPENQUERYOpenRowset。 必须根据需要更改数据源名称和目录名称。

------------------------------------------
--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 服务器”主题在代码示例中存在文档 bug:

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

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

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

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

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

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

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 提供程序,并将这些提供程序配置为在进程内加载。 由于 MSOLAP 提供程序不是由 SQL Server 安装的,因此它配置为在进程外加载。 Microsoft 强烈建议你更改 OLAP 提供程序的选项以作为进程内加载,因为此配置可提高 OLAP 查询的性能。 若要进行更改,请执行以下步骤:

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

References

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

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

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