如何使用 OLAP 伺服器執行 SQL Server 分散式查詢

本文說明如何使用 OLAP 伺服器來執行 SQL Server 分散式查詢。

原始產品版本:   Sqlserver
原始 KB 編號:   218592

摘要

本文說明如何執行 SQL Server 分散式查詢,以從 OLAP 服務 (或 Analysis Services) cube 中取得資料。 透過 Microsoft SQL Server,您可以針對 OLE DB 提供者執行查詢。 若要這麼做,您可以使用下列其中一項:

  • 使用 OPENQUERY or OPENROWSET Transact-SQL 函數。
  • 使用含四部分名稱的查詢,包含連結的伺服器名稱。

例如:

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

您可以使用 OPENROWSET OPENQUERY SQL Server 語句中的 or 函數 SELECT ,將查詢傳遞至連結的 OLAP 伺服器。 查詢會限制為 SELECT OLAP 服務支援的縮寫語法; 但查詢可以包含多維度運算式 (的 MDX) 語法。 包含 MDX 的查詢會依照 OLE DB 檔中所述傳回單一化的資料列 。 如需 SELECT SQL SERVER OLAP 服務所支援之語法的詳細資訊,請參閱 OLAP Services 線上叢書中的 支援的 SQL SELECT 句法 主題。

若要從 SQL Server 查詢本機或遠端 OLAP 伺服器資料庫,您必須在執行 SQL Server 的電腦上安裝 MSOLAP OLE DB 提供者。 當您從 SQL Server 安裝 OLAP 用戶端元件時,會安裝 MSOLAP OLE DB 提供者。

OPENROWSET 和 OPENQUERY 範例

下列 Transact-SQL 程式碼範例會示範如何設定和使用具有 and 函數的 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])' )

注意

SQL Server 的查詢傳遞至連結的 Olap 伺服器 主題,在 OLAP 服務手冊中,該程式碼範例中有檔錯誤:

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

只支援有限形式的 SQL,而且只能指定層級或量值名稱。 當您執行查詢時,會收到下列錯誤訊息:

伺服器: Msg 7399,Level 16,State 1,第1列 OLE DB provider ' MSOLAP ' 報告錯誤。 [OLE/DB provider 傳回的訊息 : 欄名 ' customer ' 無效。 只能指定 level 或 measure 名稱。)

修正查詢的其中一個方法是使用下列各項:

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

不過,在該表單中,將 SQL 語句傳遞至 OLAP 伺服器的速度可能會很慢,而且在某些電腦上可能會收到逾時錯誤:

OLE DB provider ' MSOLAP ' 報告錯誤。 [OLE/DB provider 傳回郵件:無法開啟資料庫 ' foodmart '][OLE/DB provider 傳回郵件: OLAP 伺服器錯誤:要求的作業因超時而失敗。]

具有四部分名稱的連結伺服器範例

本節中的 Transact-SQL 程式碼範例會示範如何使用具有四部分名稱的連結伺服器來查詢 OLAP cube。 在程式碼中, 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 伺服器讀取整個事實資料表,並自行執行 GROUP BY (可能需要大量的資源和時間)。

Microsoft 建議您透過 or 函數傳送 MDX 語句 OPENROWSET OPENQUERY ,如先前的範例所示。 這個方法可讓 SQL Server 直接將命令傳送至連結的 OLAP 提供者,而不會嘗試加以剖析。 命令可以是 MDX 或 SQL 的 MDX 提供者所支援的子集。 您可以使用從 OPENQUERY 其他 SQL 運算子中的函數傳回的資料列集。 針對會傳回相對較少量資料量的基本 MDX 查詢和 GROUP BY 查詢 (像是 screenful) 時,結果集永遠都必須在10秒內建立(通常在5秒內),不論 cube 的大小。 如果查詢花更長的時間,您可以使用使用方式分析嚮導建立更多的聚合。

效能秘訣

以下是一些效能秘訣:

  • SQL Server 會針對每個查詢,開啟 OLAP 提供者的兩個連線。 其中一種可重複用於稍後的查詢;因此,如果您再次執行此命令,第二個查詢的執行速度會較快。

  • 若要提高速度,請依其他維度群組 (,因為您取得的資料) 較少。

  • 最壞的案例是透過關系 OLAP (ROLAP) 儲存 cube 時,沒有任何集合。 然後,OLAP 伺服器會開啟回到 SQL Server 的連線,以取得事實資料表的資料列。 在此情況下,請勿使用 SQL Server 分散式查詢。

  • 如果您只需要 OLAP 伺服器或 cube 檔案的結果集,請嘗試使用 OLE DB c + + 應用程式或 ADO (ADO * MD) 應用程式,直接針對 OLAP 伺服器或任何 cube 檔案執行 SQL Server 或多維度查詢。

  • SQL Server 會安裝某些 OLE DB 提供者,並將其設定為在處理中載入。 由於 SQL Server 並未安裝 MSOLAP 提供者,因此會將其設定為載入進程外。 Microsoft 強烈建議您將 OLAP 提供者的選項變更為以進程形式載入,因為這項設定會提升 OLAP 查詢的效能。 若要進行變更,請遵循下列步驟:

    1. 在 [安全性] 資料夾中,以滑鼠右鍵按一下 [ 連結的伺服器],然後按一下 [ 新增連結伺服器]。
    2. 若為提供者名稱,按一下以選取 [ 適用于 OLAP 服務的 OLE DB 提供者]。
    3. 按一下 [選項]
    4. 按一下以選取 [ 允許進程 間]。
    5. 按一下 [確定]。

參考

  • 如需 sp_addlinkedserver 預存過程參數的詳細描述,請參閱 SQL Server 線上叢書。

  • 如需 sp_addlinkedserver OPENQUERY OPENROWSET 在 SQL Server 線上叢書中設定及使用分散式查詢、搜尋、、和相關主題的詳細資訊。

  • 若要深入瞭解 OLAP 技術和 MDX 語法,請參閱 OLAP 服務線上叢書。