Så här utför du en SQL Server distribuerad fråga med OLAP Server

I den här artikeln beskrivs hur du utför en SQL Server distribuerad fråga med OLAP Server.

Ursprunglig produktversion: SQL Server
Ursprungligt KB-nummer: 218592

Sammanfattning

Den här artikeln beskriver hur du utför en SQL Server distribuerad fråga för att hämta data från en OLAP Services-kub (eller Analysis Services). Med Microsoft SQL Server kan du köra frågor mot OLE DB-leverantörer. Om du vill göra detta kan du använda något av följande:

  • OPENQUERY Använd eller OPENROWSET Transact-SQL-funktionerna.
  • Använd en fråga med namn i fyra delar, inklusive ett linked-server-namn.

Till exempel:

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

Du kan använda OPENROWSET funktionen eller OPENQUERY i en SQL Server-instruktion SELECT för att skicka frågor till den länkade OLAP-servern. Frågan är begränsad till den förkortade SELECT syntax som stöds av OLAP Services. Frågan kan dock innehålla MDX-syntax (Multidimensional Expressions). En fråga som innehåller MDX returnerar utplattade rader enligt beskrivningen i OLE DB-dokumentationen. Mer information om syntaxen SELECT som stöds av SQL Server OLAP Services finns i avsnittet SQL SELECT-syntax som stöds i OLAP Services Books Online.

Om du vill fråga en lokal eller fjärransluten OLAP-serverdatabas från SQL Server måste du installera MSOLAP OLE DB-providern på den dator som kör SQL Server. MSOLAP OLE DB-providern installeras när du installerar OLAP-klientkomponenterna från SQL Server.

OPENROWSET- och OPENQUERY-exempel

Följande Transact-SQL-kodexempel visar hur du konfigurerar och använder distribuerade frågor med en OLAP-server med OPENQUERY funktionerna och OpenRowset . Du måste ändra datakällans namn och katalognamn efter behov.

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

Obs!

Avsnittet Skicka frågor från SQL Server till en länkad OLAP-server i OLAP Services Books Online innehåller en dokumentationsfel i kodexemplet:

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

Endast en begränsad form av SQL stöds och endast nivå- eller måttnamn kan anges. När du kör frågan får du följande felmeddelande:

Server: Msg 7399, Level 16, State 1, Line 1 OLE DB provider 'MSOLAP' rapporterade ett fel. [OLE/DB-providern returnerade meddelandet: Kolumnnamnet "kund" är ogiltigt. Endast nivå- eller måttnamn kan anges.]

Ett sätt att åtgärda frågan är att använda följande:

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

Det kan dock vara långsamt att skicka SQL-instruktioner i det formuläret till OLAP Server, och du kan få ett timeout-fel på vissa datorer:

OLE DB-providern MSOLAP rapporterade ett fel. [OLE/DB-providern returnerade meddelandet: Det går inte att öppna databasen "foodmart"] [OLE/DB-providern returnerade meddelandet: OLAP-serverfel: Den begärda åtgärden misslyckades på grund av timeout.]

Exempel på länkad server med namn i fyra delar

Transact-SQL-kodexemplet i det här avsnittet visar användningen av en länkad server med ett namn i fyra delar för att fråga en OLAP-kub. I koden skapades den länkade servern med namnet Olap_server i föregående exempel:

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]

Även om länkade serverexempel med ett namn i fyra delar fungerar bra kan det ta lång tid att returnera ett resultat till klienten. Syntaxen för namn i fyra delar är ett SQL Server begrepp. Den används i ett Transact-SQL-kommando för att referera till en tabell på en länkad server och har begränsad syntax för OLAP-frågor. SQL Server kan avgöra att den måste läsa hela faktatabellen från OLAP Server och utföra GROUP BY sig själv, vilket kan ta betydande resurser och tid.

Microsoft rekommenderar att du skickar en MDX-instruktion via en OPENROWSET eller en OPENQUERY funktion, som du ser i de tidigare exemplen. Med den här metoden kan SQL Server skicka kommandot direkt till den länkade OLAP-providern utan att försöka parsa det. Kommandot kan vara MDX eller den delmängd av SQL som OLAP-providern stöder. Du kan använda raduppsättningen som returneras från OPENQUERY funktionen i andra SQL-operatorer. För grundläggande MDX-frågor och GROUP BY frågor som returnerar en relativt liten mängd data (t.ex. en skärmfull) måste resultatuppsättningen alltid skapas på mindre än 10 sekunder, vanligtvis inom 5 sekunder, oavsett kubens storlek. Om frågorna tar längre tid kan du skapa fler aggregeringar med hjälp av guiden för användningsbaserad analys.

Prestandatips

Här följer några prestandatips:

  • SQL Server öppnar två anslutningar till OLAP-providern för varje fråga. En av dessa återanvänds för senare frågor. Därför kan den andra frågan köras snabbare om du kör kommandot igen.

  • Om du vill öka hastigheten grupperar du efter en annan dimension (eftersom du får mindre data).

  • Ett värsta scenario är när kuben lagras via relations-OLAP (ROLAP) och det inte finns någon aggregering. Sedan öppnar OLAP-servern en anslutning tillbaka till SQL Server för att hämta faktatabellraderna. Använd inte en SQL Server distribuerad fråga i det här fallet.

  • Om du bara behöver en resultatuppsättning från en OLAP-server eller en kubfil kan du prova att köra SQL Server eller den flerdimensionella frågan direkt mot OLAP-servern eller en kubfil med hjälp av ett OLE DB C++-program eller ett ADO-program (ADO*MD).

  • SQL Server installerar vissa OLE DB-providrar och konfigurerar dem för att läsa in i processen. Eftersom MSOLAP-providern inte har installerats av SQL Server är den konfigurerad för att läsa in out-of-process. Microsoft rekommenderar starkt att du ändrar alternativen för att OLAP-providern ska läsas in som under processen, eftersom den här konfigurationen förbättrar prestandan för dina OLAP-frågor. Följ dessa steg för att göra ändringen:

    1. Högerklicka på Länkade servrar i mappen Säkerhet och klicka sedan på Ny länkad server.
    2. För Providernamn klickar du för att välja OLE DB-provider för OLAP-tjänster.
    3. Klicka på Alternativ.
    4. Klicka här om du vill välja Tillåt InProcess.
    5. Klicka på OK.

Referenser

  • En detaljerad beskrivning av parametrarna för lagrad sp_addlinkedserver procedur finns i SQL Server Books Online.

  • Mer information om hur du konfigurerar och använder distribuerade frågor sp_addlinkedserver finns i , OPENQUERY, OPENROWSEToch relaterade ämnen i SQL Server Books Online.

  • Mer information om OLAP-teknik och MDX-syntax finns i OLAP Services Books Online.