Como executar uma consulta distribuída SQL Server com o OLAP Server

Este artigo descreve como executar uma consulta distribuída SQL Server com o OLAP Server.

Versão original do produto: SQL Server
Número de KB original: 218592

Resumo

Este artigo descreve como executar uma consulta distribuída SQL Server para recuperar dados de um cubo do OLAP Services (ou Analysis Services). Com o Microsoft SQL Server, você pode executar consultas em provedores OLE DB. Para fazer isso, você pode usar um dos seguintes procedimentos:

  • Use as OPENQUERY funções transact-SQL.OPENROWSET
  • Use uma consulta com nomes de quatro partes, incluindo um nome de servidor vinculado.

Por exemplo:

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

Você pode usar a OPENROWSET função ou OPENQUERY em uma instrução SQL Server SELECT para passar consultas para o servidor OLAP vinculado. A consulta é limitada à sintaxe abreviada SELECT com suporte dos Serviços OLAP; no entanto, a consulta pode incluir a sintaxe MDX (Expressões Multidimensionais). Uma consulta que inclui o MDX retorna conjuntos de linhas achatados , conforme descrito na documentação do OLE DB. Para obter mais informações sobre a SELECT sintaxe suportada por SQL Server Serviços OLAP, consulte o tópico sintaxe SQL SELECT com suporte no OLAP Services Books Online.

Para consultar um banco de dados de servidor OLAP local ou remoto de SQL Server, você precisa instalar o provedor OLE DB do MSOLAP no computador que está executando SQL Server. O provedor OLE DB do MSOLAP é instalado quando você instala os componentes do cliente OLAP do SQL Server.

Exemplo OPENROWSET e OPENQUERY

O exemplo de código Transact-SQL a seguir demonstra como configurar e usar consultas distribuídas com um servidor OLAP com as OPENQUERYOpenRowset funções e. Você deve alterar os nomes da fonte de dados e o nome do catálogo conforme apropriado.

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

Observação

A passagem de consultas de SQL Server para um tópico do Servidor OLAP Vinculado, no OLAP Services Books Online, tem um bug de documentação no exemplo de código:

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

Há suporte apenas para uma forma limitada de SQL e somente nomes de nível ou medida podem ser especificados. Ao executar a consulta, você recebe esta mensagem de erro:

Servidor: Msg 7399, Nível 16, Estado 1, Provedor OLE DB da Linha 1 'MSOLAP' relatou um erro. [Mensagem retornada: do provedor OLE/DB O nome da coluna 'cliente' é inválido. Somente nomes de nível ou medida podem ser especificados.]

Uma maneira de corrigir a consulta é usar o seguinte:

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

No entanto, passar instruções SQL nesse formulário para o OLAP Server pode ser lento e você pode receber um erro de tempo limite em alguns computadores:

O provedor OLE DB 'MSOLAP' relatou um erro. [Mensagem retornada do provedor OLE/DB: não é possível abrir o banco de dados 'foodmart'] [Provedor OLE/DB retornado mensagem: erro do servidor OLAP: a operação solicitada falhou devido ao tempo limite.]

Exemplos de servidor vinculado com nomes de quatro partes

O exemplo de código Transact-SQL nesta seção demonstra o uso de um servidor vinculado com um nome de quatro partes para consultar um cubo OLAP. No código, o servidor vinculado nomeado Olap_server foi criado no exemplo anterior:

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]

Embora exemplos de servidor vinculados com um nome de quatro partes funcionem bem, eles podem levar muito tempo para retornar um resultado ao cliente. A sintaxe de nome de quatro partes é um conceito SQL Server; é usada em um comando Transact-SQL para se referir a uma tabela em um servidor vinculado e tem sintaxe limitada para consultas OLAP. SQL Server pode determinar que ele deve ler toda a tabela de fatos do OLAP Server e executar o próprio, o GROUP BY que pode levar recursos e tempo significativos.

A Microsoft recomenda que você envie uma instrução MDX por meio de uma OPENROWSET ou uma OPENQUERY função, conforme mostrado nos exemplos anteriores. Esse método permite que SQL Server envie o comando diretamente para o provedor OLAP vinculado, sem tentar analisá-lo. O comando pode ser MDX ou o subconjunto de SQL que o provedor OLAP dá suporte. Você pode usar o conjunto de linhas retornado da OPENQUERY função em outros operadores SQL. Para consultas e GROUP BY consultas MDX básicas que retornam uma quantidade relativamente pequena de dados (como uma tela), o conjunto de resultados deve ser sempre criado em menos de 10 segundos, geralmente em 5 segundos, independentemente do tamanho do cubo. Se as consultas demorarem mais, você poderá criar mais agregações usando o assistente de análise baseado em uso.

Dicas de desempenho

Aqui estão algumas dicas de desempenho:

  • SQL Server abre duas conexões com o provedor OLAP para cada consulta. Um deles é reutilizado para consultas posteriores; Portanto, se você executar o comando novamente, a segunda consulta poderá ser executada mais rapidamente.

  • Para aumentar a velocidade, agrupar por outra dimensão (porque você está recebendo menos dados).

  • O pior cenário seria quando o cubo é armazenado por meio de ROLAP (OLAP relacional) e não há agregação. Em seguida, o servidor OLAP abre uma conexão de volta para SQL Server para obter as linhas de tabela de fatos. Não use uma consulta distribuída SQL Server nesse caso.

  • Se você precisar apenas de um conjunto de resultados de um servidor OLAP ou de um arquivo cubo, tente executar o SQL Server ou a consulta multidimensional diretamente no servidor OLAP ou em qualquer arquivo de cubo usando um aplicativo OLE DB C++ ou um aplicativo ADO(ADO*MD).

  • SQL Server instala alguns provedores OLE DB e os configura para carregar em processo. Como o provedor MSOLAP não está instalado por SQL Server, ele está configurado para carregar fora do processo. A Microsoft recomenda que você altere as opções para o provedor OLAP carregar como em processo, pois essa configuração melhora o desempenho de suas consultas OLAP. Para fazer a alteração, siga estas etapas:

    1. Na pasta Segurança, clique com o botão direito do mouse em Servidores Vinculados e clique em Novo Servidor Vinculado.
    2. Para o Nome do Provedor, clique para selecionar Provedor OLE DB para Serviços OLAP.
    3. Clique em Opções.
    4. Clique para selecionar Permitir InProcess.
    5. Clique em OK.

Referências

  • Para obter uma descrição detalhada dos sp_addlinkedserver parâmetros de procedimento armazenados, consulte SQL Server Livros Online.

  • Para obter mais detalhes sobre como configurar e usar consultas distribuídas, pesquise em sp_addlinkedserver , OPENQUERY, OPENROWSETe tópicos relacionados, em SQL Server Livros Online.

  • Para saber mais sobre a tecnologia OLAP e a sintaxe MDX, consulte OLAP Services Books Online.