OLAP Server를 사용하여 SQL Server 분산 쿼리를 수행하는 방법

이 문서에서는 OLAP Server를 사용하여 SQL Server 분산 쿼리를 수행하는 방법을 설명합니다.

원래 제품 버전: SQL Server
원본 KB 번호: 218592

요약

이 문서에서는 SQL Server 분산 쿼리를 수행하여 OLAP 서비스(또는 Analysis Services) 큐브에서 데이터를 검색하는 방법을 설명합니다. Microsoft SQL Server 사용하면 OLE DB 공급자에 대해 쿼리를 수행할 수 있습니다. 이렇게 하려면 다음 중 하나를 사용할 수 있습니다.

  • OPENQUERY 또는 OPENROWSET Transact-SQL 함수를 사용합니다.
  • 연결된 서버 이름을 포함하여 네 부분으로 구성된 이름의 쿼리를 사용합니다.

예를 들면

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 서비스에서 지원하는 약어 SELECT 구문으로 제한되지만 쿼리에는 MDX(다차원 식) 구문이 포함될 수 있습니다. MDX를 포함하는 쿼리는 OLE DB 설명서에 설명 된 대로 평면화된 행 집합 을 반환합니다. SQL Server OLAP 서비스에서 지원하는 구문에 대한 SELECT 자세한 내용은 OLAP 서비스 온라인 설명서에서 지원되는 SQL SELECT 구문 항목을 참조하세요.

SQL Server 로컬 또는 원격 OLAP 서버 데이터베이스를 쿼리하려면 SQL Server 실행 중인 컴퓨터에 MSOLAP OLE DB 공급자를 설치해야 합니다. MSOLAP OLE DB 공급자는 SQL Server OLAP 클라이언트 구성 요소를 설치할 때 설치됩니다.

OPENROWSET 및 OPENQUERY 예제

다음 Transact-SQL 코드 예제에서는 및 OpenRowset 함수를 사용하여 OLAP 서버 OPENQUERY 에서 분산 쿼리를 설정하고 사용하는 방법을 보여 줍니다. 데이터 원본 이름과 카탈로그 이름을 적절하게 변경해야 합니다.

------------------------------------------
--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 서버로 쿼리 전달 항목에는 코드 예제에 설명서 버그가 있습니다.

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

제한된 형식의 SQL만 지원되며 수준 또는 측정값 이름만 지정할 수 있습니다. 쿼리를 실행하면 다음 오류 메시지가 표시됩니다.

서버: Msg 7399, 수준 16, 상태 1, 줄 1 OLE DB 공급자 'MSOLAP'에서 오류를 보고했습니다. [OLE/DB 공급자가 메시지를: 반환했습니다. 열 이름 'customer'가 잘못되었습니다. 수준 또는 측정값 이름만 지정할 수 있습니다.]

쿼리를 수정하는 한 가지 방법은 다음을 사용하는 것입니다.

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

그러나 해당 형식의 SQL 문을 OLAP Server에 전달하는 것이 느려질 수 있으며 일부 컴퓨터에서 시간 제한 오류가 발생할 수 있습니다.

OLE DB 공급자 'MSOLAP'에서 오류를 보고했습니다. [OLE/DB 공급자가 반환한 메시지: 데이터베이스 'foodmart'를 열 수 없음] [OLE/DB 공급자가 반환한 메시지: OLAP 서버 오류: 시간 제한으로 인해 요청된 작업이 실패했습니다.]

네 부분으로 구성된 이름의 연결된 서버 예제

이 섹션의 Transact-SQL 코드 예제에서는 네 부분으로 구성된 이름의 연결된 서버를 사용하여 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]

네 부분으로 구성된 이름의 연결된 서버 예제는 제대로 작동하지만 결과를 클라이언트에 반환하는 데 시간이 오래 걸릴 수 있습니다. 네 부분으로 구성된 이름 구문은 SQL Server 개념입니다. Transact-SQL 명령에서 연결된 서버의 테이블을 참조하는 데 사용되며 OLAP 쿼리에 대한 구문이 제한되어 있습니다. SQL Server OLAP 서버에서 전체 팩트 테이블을 읽고 상당한 리소스와 시간이 걸릴 수 있는 자체 작업을 수행해야 GROUP BY 한다고 결정할 수 있습니다.

이전 예제와 같이 또는 OPENQUERY 함수를 OPENROWSET 통해 MDX 문을 보내는 것이 좋습니다. 이 메서드를 사용하면 SQL Server 명령을 구문 분석하지 않고 연결된 OLAP 공급자에 직접 보낼 수 있습니다. 명령은 MDX 또는 OLAP 공급자가 지원하는 SQL의 하위 집합일 수 있습니다. 다른 SQL 연산자의 함수에서 반환된 행 집합을 OPENQUERY 사용할 수 있습니다. 비교적 적은 양의 데이터(예: 화면 캡처)를 반환하는 기본 MDX 쿼리 및 GROUP BY 쿼리의 경우 결과 집합은 큐브 크기에 관계없이 일반적으로 5초 이내에 항상 10초 이내에 만들어야 합니다. 쿼리가 더 오래 걸리는 경우 사용량 기반 분석 마법사를 사용하여 더 많은 집계를 빌드할 수 있습니다.

성능 팁

다음은 몇 가지 성능 팁입니다.

  • SQL Server 모든 쿼리에 대해 OLAP 공급자에 대한 두 개의 연결을 엽니다. 그 중 하나는 이후 쿼리에 다시 사용됩니다. 따라서 명령을 다시 실행하면 두 번째 쿼리가 더 빠르게 실행될 수 있습니다.

  • 속도를 높이려면 다른 차원으로 그룹화합니다(데이터가 적기 때문).

  • 최악의 시나리오는 큐브가 ROLAP(관계형 OLAP)를 통해 저장되고 집계가 없는 경우입니다. 그런 다음 OLAP 서버는 SQL Server 대한 연결을 다시 열어 팩트 테이블 행을 가져옵니다. 이 경우 SQL Server 분산 쿼리를 사용하지 마세요.

  • OLAP 서버 또는 큐브 파일의 결과 집합만 필요한 경우 OLE DB C++ 애플리케이션 또는 ADO(ADO*MD) 애플리케이션을 사용하여 OLAP 서버 또는 큐브 파일에 대해 직접 SQL Server 또는 다차원 쿼리를 실행해 보세요.

  • SQL Server 일부 OLE DB 공급자를 설치하고 인프로세스를 로드하도록 구성합니다. MSOLAP 공급자는 SQL Server 설치되지 않으므로 out-of-process를 로드하도록 구성됩니다. 이 구성은 OLAP 쿼리의 성능을 향상시키므로 OLAP 공급자가 프로세스 내로 로드할 수 있는 옵션을 변경하는 것이 좋습니다. 변경하려면 다음 단계를 수행합니다.

    1. 보안 폴더에서 연결된 서버를 마우스 오른쪽 단추로 클릭한 다음 새 연결된 서버를 클릭합니다.
    2. 공급자 이름에 대해 을 클릭하여 OLAP 서비스에 대한 OLE DB 공급자를 선택합니다.
    3. 옵션을 클릭합니다.
    4. InProcess 허용을 클릭하여 선택합니다.
    5. 확인을 클릭합니다.

참조

  • 저장 프로시저 매개 변수에 대한 자세한 설명은 sp_addlinkedserver 온라인 설명서 SQL Server 참조하세요.

  • 분산 쿼리 설정 및 사용에 대한 자세한 내용은 SQL Server 온라인 설명서에서 , OPENQUERY, OPENROWSET및 관련 topics 검색 sp_addlinkedserver 합니다.

  • OLAP 기술 및 MDX 구문에 대한 자세한 내용은 OLAP 서비스 온라인 설명서를 참조하세요.