OLAP Server でSQL Server分散クエリを実行する方法

この記事では、OLAP Server でSQL Server分散クエリを実行する方法について説明します。

元の製品バージョン: SQL Server
元の KB 番号: 218592

概要

この記事では、SQL Server分散クエリを実行して OLAP Services (または Analysis Services) キューブからデータを取得する方法について説明します。 Microsoft SQL Serverでは、OLE DB プロバイダーに対してクエリを実行できます。 これを行うには、次のいずれかを使用します。

  • OPENQUERYまたは Transact-SQL 関数をOPENROWSET使用します。
  • リンク サーバー名を含む 4 部構成の名前を持つクエリを使用します。

例:

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

SQL Server SELECT ステートメントの または 関数をOPENQUERY使用OPENROWSETして、リンクされた 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 へのクエリの受け渡し」トピックには、コード例のドキュメントバグがあります。

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

制限された形式の SQL のみがサポートされ、レベル名またはメジャー名のみを指定できます。 クエリを実行すると、次のエラー メッセージが表示されます。

サーバー: メッセージ 7399、レベル 16、状態 1、1 行目の OLE DB プロバイダー 'MSOLAP' からエラーが報告されました。 [OLE/DB プロバイダーがメッセージ: を返しました列名 'customer' が無効です。 レベル名またはメジャー名のみを指定できます。

クエリを修正する方法の 1 つは、次を使用することです。

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

ただし、その形式の SQL ステートメントを OLAP Server に渡すのが遅く、一部のコンピューターでタイムアウト エラーが発生する可能性があります。

OLE DB プロバイダー 'MSOLAP' からエラーが報告されました。 [OLE/DB プロバイダーから返されたメッセージ: データベース 'foodmart' を開くことができません][OLE/DB プロバイダーからメッセージが返されました: OLAP サーバー エラー: 要求された操作がタイムアウトのため失敗しました。]

4 部構成の名前を持つリンク サーバーの例

このセクションの Transact-SQL コード例では、4 部構成の名前を持つリンク サーバーを使用して 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]

4 部構成の名前を持つリンク サーバーの例は問題ありませんが、クライアントに結果を返すには長い時間がかかる場合があります。 4 部構成の名前構文はSQL Server概念です。これは Transact-SQL コマンドでリンク サーバー内のテーブルを参照するために使用され、OLAP クエリの構文は制限されています。 SQL Serverは、OLAP Server からファクト テーブル全体を読み取り、それ自体をGROUP BY実行する必要があると判断する場合があり、リソースと時間がかかる可能性があります。

Microsoft では、前の例に示すように、 または 関数をOPENROWSETOPENQUERY介して MDX ステートメントを送信することをお勧めします。 このメソッドを使用すると、SQL Server解析を試みることなく、リンクされた OLAP プロバイダーに直接コマンドを送信できます。 コマンドには、MDX または OLAP プロバイダーがサポートする SQL のサブセットを指定できます。 関数から返される行セットは、他の OPENQUERY SQL 演算子で使用できます。 比較的少量のデータ (スクリーンフルなど) を返す基本的な MDX クエリと GROUP BY クエリの場合、キューブのサイズに関係なく、結果セットは常に 10 秒未満 (通常は 5 秒) 未満で作成する必要があります。 クエリに時間がかかる場合は、使用量ベースの分析ウィザードを使用して、より多くの集計を作成できます。

パフォーマンスに関するヒント

パフォーマンスに関するヒントを次に示します。

  • SQL Serverは、クエリごとに OLAP プロバイダーへの 2 つの接続を開きます。 そのうちの 1 つは、後のクエリで再利用されます。そのため、コマンドをもう一度実行すると、2 番目のクエリの実行速度が速くなる可能性があります。

  • 速度を上げるには、別のディメンションでグループ化します (データが少なくなっているためです)。

  • 最悪のシナリオは、キューブがリレーショナル OLAP (ROLAP) を介して格納され、集計がない場合です。 その後、OLAP サーバーは、ファクト テーブル行を取得するためにSQL Serverへの接続を開きます。 この場合は、SQL Server分散クエリを使用しないでください。

  • OLAP サーバーまたはキューブ ファイルからの結果セットが必要な場合は、OLE DB C++ アプリケーションまたは ADO(ADO*MD) アプリケーションを使用して、OLAP サーバーまたはキューブ ファイルに対して直接、SQL Serverまたは多次元クエリを実行してみてください。

  • SQL Serverは、一部の OLE DB プロバイダーをインストールし、インプロセスで読み込むよう構成します。 MSOLAP プロバイダーはSQL Serverによってインストールされていないため、アウトプロセスを読み込むよう構成されています。 この構成により OLAP クエリのパフォーマンスが向上するため、OLAP プロバイダーがインプロセスとして読み込まれるようにオプションを変更することを強くお勧めします。 変更を行うには、次の手順に従います。

    1. [セキュリティ] フォルダーで、[ リンク サーバー] を右クリックし、[ 新しいリンク サーバー] をクリックします。
    2. [プロバイダー名] で、[ OLE DB Provider for OLAP Services] をクリックして選択します。
    3. [オプション] をクリックします。
    4. [ InProcess の許可] をクリックします。
    5. [OK] をクリックします。

関連情報

  • ストアド プロシージャ パラメーターの詳細については、「オンライン ブックのsp_addlinkedserverSQL Server」を参照してください。

  • 分散クエリの設定と使用の詳細については、「オンライン ブック」で、、OPENQUERYOPENROWSET、および関連トピックを検索sp_addlinkedserverSQL Server。

  • OLAP テクノロジと MDX 構文の詳細については、「OLAP Services オンライン ブック」を参照してください。