Ausführen einer SQL Server verteilten Abfrage mit OLAP Server

In diesem Artikel wird beschrieben, wie Sie eine SQL Server verteilte Abfrage mit OLAP Server ausführen.

Ursprüngliche Produktversion: SQL Server
Ursprüngliche KB-Nummer: 218592

Zusammenfassung

In diesem Artikel wird beschrieben, wie Sie eine SQL Server verteilte Abfrage ausführen, um Daten aus einem OLAP Services-Cube (oder Analysis Services)-Cube abzurufen. Mit Microsoft SQL Server können Sie Abfragen für OLE DB-Anbieter ausführen. Dazu können Sie eine der folgenden Optionen verwenden:

  • Verwenden Sie die OPENQUERY -Funktion oder die OPENROWSET Transact-SQL-Funktion.
  • Verwenden Sie eine Abfrage mit vierteiligen Namen, einschließlich eines Verbindungsservernamens.

Zum Beispiel:

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

Sie können die OPENROWSET - oder -OPENQUERYFunktion in einer SQL Server-Anweisung SELECT verwenden, um Abfragen an den verknüpften OLAP-Server zu übergeben. Die Abfrage ist auf die abgekürzte SELECT Syntax beschränkt, die von OLAP Services unterstützt wird. Die Abfrage kann jedoch MDX-Syntax (Multidimensional Expressions) enthalten. Eine Abfrage, die MDX enthält, gibt vereinfachte Rowsets zurück, wie in der OLE DB-Dokumentation beschrieben. Weitere Informationen zur Syntax, die SELECT von SQL Server OLAP-Diensten unterstützt wird, finden Sie im Thema Unterstützte SQL SELECT-Syntax in der OLAP Services-Onlinedokumentation.

Um eine lokale oder remote OLAP-Serverdatenbank von SQL Server abzufragen, müssen Sie den MSOLAP OLE DB-Anbieter auf dem Computer installieren, auf dem SQL Server ausgeführt wird. Der MSOLAP OLE DB-Anbieter wird installiert, wenn Sie die OLAP-Clientkomponenten aus dem SQL Server installieren.

OPENROWSET- und OPENQUERY-Beispiel

Im folgenden Transact-SQL-Codebeispiel wird veranschaulicht, wie verteilte Abfragen mit einem OLAP-Server mit den OPENQUERY Funktionen und eingerichtet und OpenRowset verwendet werden. Sie müssen die Datenquellennamen und den Katalognamen entsprechend ändern.

------------------------------------------
--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])' )

Hinweis

Das Thema Übergeben von Abfragen von SQL Server an einen verknüpften OLAP-Server in der OLAP Services-Onlinedokumentation weist im Codebeispiel einen Dokumentationsfehler auf:

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

Es wird nur eine eingeschränkte Form von SQL unterstützt, und es können nur Ebenen- oder Measurenamen angegeben werden. Wenn Sie die Abfrage ausführen, erhalten Sie die folgende Fehlermeldung:

Server: Msg 7399, Level 16, State 1, Line 1 OLE DB-Anbieter "MSOLAP" hat einen Fehler gemeldet. [Meldung: vom OLE/DB-Anbieter zurückgegeben Der Spaltenname "customer" ist ungültig. Es können nur Ebenen- oder Measurenamen angegeben werden.]

Eine Möglichkeit, die Abfrage zu beheben, besteht darin, Folgendes zu verwenden:

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

Die Übergabe von SQL-Anweisungen in dieser Form an OLAP Server ist jedoch möglicherweise langsam, und auf einigen Computern tritt möglicherweise ein Timeoutfehler auf:

DER OLE DB-Anbieter "MSOLAP" hat einen Fehler gemeldet. [Meldung des OLE/DB-Anbieters: Die Datenbank "foodmart" kann nicht geöffnet werden] [Der OLE/DB-Anbieter hat eine Meldung zurückgegeben: OLAP-Serverfehler: Der angeforderte Vorgang ist aufgrund eines Timeouts fehlgeschlagen.]

Beispiele für Verbindungsserver mit vierteiligen Namen

Das Transact-SQL-Codebeispiel in diesem Abschnitt veranschaulicht die Verwendung eines Verbindungsservers mit einem vierteiligen Namen zum Abfragen eines OLAP-Cubes. Im Code wurde der Verbindungsserver mit dem Namen Olap_server im vorherigen Beispiel erstellt:

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]

Obwohl Beispiele für Verbindungsserver mit einem vierteiligen Namen gut funktionieren, kann es lange dauern, bis ein Ergebnis an den Client zurückgegeben wird. Die vierteilige Namenssyntax ist ein SQL Server Konzept. Sie wird in einem Transact-SQL-Befehl verwendet, um auf eine Tabelle auf einem Verbindungsserver zu verweisen, und verfügt über eine eingeschränkte Syntax für OLAP-Abfragen. SQL Server können feststellen, dass die gesamte Faktentabelle aus OLAP Server gelesen und selbst GROUP BY ausgeführt werden muss, was erhebliche Ressourcen und Zeit in Anspruch nehmen kann.

Microsoft empfiehlt, eine MDX-Anweisung über eine OPENROWSET - oder - OPENQUERY Funktion zu senden, wie in den vorherigen Beispielen gezeigt. Mit dieser Methode können SQL Server den Befehl direkt an den verknüpften OLAP-Anbieter senden, ohne ihn zu analysieren. Der Befehl kann MDX oder die Teilmenge von SQL sein, die der OLAP-Anbieter unterstützt. Sie können das von der OPENQUERY Funktion zurückgegebene Rowset in anderen SQL-Operatoren verwenden. Bei grundlegenden MDX-Abfragen und GROUP BY Abfragen, die eine relativ kleine Datenmenge zurückgeben (z. B. ein Bildschirm), muss das Resultset immer in weniger als 10 Sekunden erstellt werden, in der Regel in 5 Sekunden, unabhängig von der Größe des Cubes. Wenn Abfragen länger dauern, können Sie mithilfe des Assistenten für die nutzungsbasierte Analyse weitere Aggregationen erstellen.

Leistungstipps

Hier sind einige Leistungstipps:

  • SQL Server öffnet für jede Abfrage zwei Verbindungen mit dem OLAP-Anbieter. Eine davon wird für spätere Abfragen wiederverwendet. Wenn Sie den Befehl daher erneut ausführen, wird die zweite Abfrage möglicherweise schneller ausgeführt.

  • Um die Geschwindigkeit zu erhöhen, gruppieren Sie nach einer anderen Dimension (da Sie weniger Daten erhalten).

  • Ein Worst-Case-Szenario wäre, wenn der Cube über relationales OLAP (ROLAP) gespeichert wird und keine Aggregation vorhanden ist. Anschließend öffnet der OLAP-Server eine Verbindung zurück zu SQL Server, um die Faktentabellenzeilen abzurufen. Verwenden Sie in diesem Fall keine SQL Server verteilte Abfrage.

  • Wenn Sie nur ein Resultset von einem OLAP-Server oder einer Cubedatei benötigen, versuchen Sie, die SQL Server oder die mehrdimensionale Abfrage direkt für den OLAP-Server oder eine beliebige Cubedatei auszuführen, indem Sie eine OLE DB-C++-Anwendung oder eine ADO(ADO*MD)-Anwendung verwenden.

  • SQL Server installiert einige OLE DB-Anbieter und konfiguriert diese so, dass sie während des Prozesses geladen werden. Da der MSOLAP-Anbieter nicht von SQL Server installiert wird, ist er so konfiguriert, dass er außerhalb des Prozesses geladen wird. Microsoft empfiehlt dringend, die Optionen für den OLAP-Anbieter so zu ändern, dass er als prozessintern geladen wird, da diese Konfiguration die Leistung Ihrer OLAP-Abfragen verbessert. Führen Sie die folgenden Schritte aus, um die Änderung vorzunehmen:

    1. Klicken Sie im Ordner Sicherheit mit der rechten Maustaste auf Verbindungsserver, und klicken Sie dann auf Neuer Verbindungsserver.
    2. Klicken Sie unter Anbietername auf OLE DB-Anbieter für OLAP-Dienste.
    3. Klicken Sie auf Optionen.
    4. Klicken Sie hier, um InProcess zulassen auszuwählen.
    5. Klicken Sie auf OK.

References

  • Eine ausführliche Beschreibung der Parameter für gespeicherte sp_addlinkedserver Prozeduren finden Sie in der SQL Server-Onlinedokumentation.

  • Weitere Informationen zum Einrichten und Verwenden von verteilten Abfragen finden Sie in der SQL Server-Onlinedokumentation zu sp_addlinkedserverOPENQUERYOPENROWSET, , und verwandten Themen.

  • Weitere Informationen zur OLAP-Technologie und zur MDX-Syntax finden Sie in der OLAP Services-Onlinedokumentation.