Share via


클러스터 간 및 데이터베이스 간 쿼리

쿼리는 컨텍스트에서 데이터베이스로 지정된 특정 데이터베이스와 함께 실행됩니다. 이 데이터베이스는 권한 검사의 기본값으로 사용됩니다. 클러스터 또는 데이터베이스를 지정하지 않고 쿼리에서 엔터티를 참조하는 경우 이 데이터베이스에 대해 확인됩니다.

이 문서에서는 현재 컨텍스트 데이터베이스 외부에 있는 엔터티를 포함하는 쿼리를 실행하는 방법을 설명합니다.

사전 요구 사항

컨텍스트에서 클러스터 및 데이터베이스 식별

다음 표에서는 쿼리 환경별로 컨텍스트에서 데이터베이스를 식별하는 방법을 설명합니다.

Environment 컨텍스트의 데이터베이스
Kusto Explorer 기본 데이터베이스는 연결 패널에서 선택한 데이터베이스이며 현재 클러스터는 해당 데이터베이스를 포함하는 클러스터입니다.
Azure Data Explorer 웹 UI 기본 데이터베이스는 연결 창에서 선택한 데이터베이스이며 현재 클러스터는 해당 데이터베이스를 포함하는 클러스터입니다.
클라이언트 라이브러리 기본 데이터베이스 및 클러스터는 Kusto 연결 문자열의 및 Initial Catalog 속성에 의해 Data Source 지정됩니다.

클러스터 간 또는 데이터베이스 간 쿼리 수행

컨텍스트에서 데이터베이스 외부의 엔터티에 액세스하려면 cluster()database() 함수를 사용하여 엔터티 이름을 한정합니다.

동일한 클러스터 내의 다른 데이터베이스에 있는 테이블의 경우:

database("<DatabaseName>").<TableName>

원격 클러스터의 테이블:

cluster("<ClusterName>").database("<DatabaseName>").<TableName>

참고

쿼리를 실행하려면 기본 데이터베이스 및 쿼리에서 참조되는 다른 모든 데이터베이스에 대한 뷰어 권한이 있어야 합니다. 자세한 내용은 Kusto 역할 기반 액세스 제어를 참조하세요.

연산자를 구체적으로 사용하지 take 않더라도 쿼리에서 반환되는 레코드 수는 기본적으로 제한됩니다. 이 제한을 올리려면 notruncation 클라이언트 요청 옵션을 사용합니다. 자세한 내용은 쿼리 제한을 참조하세요.

정규화된 이름 및 공용 구조체 연산자

정규화된 이름이공용 구조체 연산자의 피연산자로 표시되면 와일드카드를 사용하여 여러 테이블과 여러 데이터베이스를 지정할 수 있습니다. 와일드카드는 클러스터 이름에 허용되지 않습니다.

union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherCluster").database("*").*

참고

기본 데이터베이스의 이름도 잠재적 일치 항목이므로 database("*") 기본값을 포함한 모든 데이터베이스의 모든 테이블을 지정합니다.

정규화된 이름 및 액세스 문 제한

정규화된 이름 또는 패턴을 restrict access 문에 포함할 수도 있습니다. 클러스터 이름의 와일드카드는 허용되지 않습니다.

다음 쿼리는 다음 엔터티에 대한 쿼리 액세스를 제한합니다.

  • 기본 데이터베이스의 my... 로 시작하는 엔터티 이름입니다.
  • 현재 클러스터의 MyOther... 라는 모든 데이터베이스에 있는 모든 테이블입니다.
  • 클러스터의 my2... 라는 모든 데이터베이스에 있는 모든 테이블 은 OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);

원격 엔터티의 스키마 변경 처리

클러스터 간 쿼리를 처리하려면 초기 쿼리 해석을 수행하는 클러스터에 원격 클러스터에서 참조되는 엔터티의 스키마가 있어야 합니다. 이 정보를 가져오기 위해 스키마를 검색하기 위한 명령이 전송된 다음 캐시에 저장됩니다.

원격 클러스터에서 스키마가 변경될 경우 캐시된 스키마가 오래될 수 있습니다. 이로 인해 새 열 또는 삭제된 열이 를 발생시키는 시나리오를 포함하여 원치 않는 효과가 발생할 Partial query failure수 있습니다. 이러한 문제를 해결하려면 .clear 캐시 원격 스키마 명령을 사용하여 스키마를 수동으로 새로 고칩니다.

함수 및 뷰

함수 및 뷰(영구 및 생성된 인라인)는 데이터베이스 및 클러스터 경계에서 테이블을 참조할 수 있습니다. 다음 코드가 유효합니다.

let MyView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherCluster").database("SomeDb").Table3 on Key;
MyView | where ...

영구 함수 및 뷰는 동일한 클러스터의 다른 데이터베이스에서 액세스할 수 있습니다.

예를 들어 데이터베이스 OtherDb에 다음 테이블 형식 함수(보기)를 만듭니다.

.create function MyView(v:string) { Table1 | where Column1 has v ...  }  

그런 다음 데이터베이스 OtherDb에 다음 스칼라 함수를 만듭니다.

.create function MyCalc(a:double, b:double, c:double) { (a + b) / c }  

기본 데이터베이스에서 이러한 엔터티는 다음과 같이 참조할 수 있습니다.

database("OtherDb").MyView("exception") | extend CalCol=database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10

클러스터 간 함수 호출의 제한 사항

테이블 형식 함수 또는 뷰는 클러스터에서 참조할 수 있습니다. 다음과 같은 제한 사항이 적용됩니다.

  • 원격 함수는 테이블 형식 스키마를 반환해야 합니다. 스칼라 함수는 동일한 클러스터에서만 액세스할 수 있습니다.
  • 원격 함수는 스칼라 인수만 수락할 수 있습니다. 하나 이상의 테이블 인수를 가져오는 함수는 동일한 클러스터에서만 액세스할 수 있습니다.
  • 원격 함수의 결과 스키마를 수정해야 합니다(쿼리의 일부를 실행하지 않고 미리 알려 줍니다). 이렇게 하면 플러그 인과 같은 쿼리 구문을 사용할 수 없습니다 pivot . (플러그 인과 같은 bag_unpack 일부 플러그 인은 결과 스키마를 정적으로 나타내는 방법을 지원하며 이 형식으로 클러스터 간 함수 호출에서 사용할 수 있습니다 .)
  • 성능상의 이유로 원격 엔터티의 스키마는 초기 호출 후 호출 클러스터에 의해 캐시됩니다. 따라서 원격 엔터티를 변경하면 캐시된 스키마 정보와 일치하지 않아 쿼리 오류가 발생할 수 있습니다. 자세한 내용은 클러스터 간 쿼리 및 스키마 변경을 참조하세요.

예제

다음 클러스터 간 호출이 유효합니다.

cluster("OtherCluster").database("SomeDb").MyView("exception") | count

다음 쿼리는 원격 스칼라 함수 MyCalc를 호출합니다. 이 호출은 규칙 #1을 위반하므로 유효하지 않습니다.

MyTable | extend CalCol=cluster("OtherCluster").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10

다음 쿼리는 원격 함수 MyCalc 를 호출하고 테이블 형식 매개 변수를 제공합니다. 이 호출은 규칙 #2를 위반하므로 유효하지 않습니다.

cluster("OtherCluster").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )

다음 쿼리는 매개 변수 tablename를 기반으로 변수 스키마 출력이 있는 원격 함수 SomeTable 를 호출합니다. 이 호출은 규칙 #3을 위반하므로 유효하지 않습니다.

의 테이블 형식 함수입니다 OtherDb.

.create function SomeTable(tablename:string) { table(tablename)  }  

기본 데이터베이스에서.

cluster("OtherCluster").database("OtherDb").SomeTable("MyTable")

다음 쿼리는 데이터(pivot() 플러그 인에 동적 출력이 있는) 기반의 변수 스키마 출력이 있는 원격 함수 GetDataPivot 를 호출합니다. 이 호출은 규칙 #3을 위반하므로 유효하지 않습니다.

의 테이블 형식 함수입니다 OtherDb.

.create function GetDataPivot() { T | evaluate pivot(PivotColumn) }  

기본 데이터베이스의 테이블 형식 함수입니다.

cluster("OtherCluster").database("OtherDb").GetDataPivot()