Share via


materialize()

쿼리 실행 기간 동안 테이블 형식 식의 값을 캡처하여 다시 계산하지 않고 쿼리에서 여러 번 참조할 수 있도록 합니다.

Syntax

materialize(expression)

구문 규칙에 대해 자세히 알아보세요.

매개 변수

이름 형식 필수 Description
expression string ✔️ 쿼리 실행 중에 계산 및 캐시할 테이블 형식 식입니다.

설명

함수는 materialize() 다음 시나리오에서 유용합니다.

  • 쿼리에서 결과가 여러 번 사용되는 많은 계산을 수행하는 쿼리 속도를 향상합니다.
  • 테이블 형식 식을 한 번만 평가하고 쿼리에서 여러 번 사용하려면 테이블 형식 식이 비결정적인 경우 일반적으로 필요합니다. 예를 들어 식에서 또는 함수를 rand()dcount() 사용하는 경우입니다.

참고

Materialize의 캐시 크기 제한은 5GB입니다. 이 제한은 클러스터 노드당이며 동시에 실행되는 모든 쿼리에 대해 상호입니다. 쿼리가 를 사용하고 materialize() 캐시가 더 이상 데이터를 보유할 수 없는 경우 쿼리는 오류와 함께 중단됩니다.

테이블 형식 식의 구체화를 수행하는 또 다른 방법은 의 플래그를 hint.materialized연산 자 및 파티션 연산자로 사용하는 것입니다. 모두 단일 구체화 캐시를 공유합니다.

  • 구체화된 데이터 세트를 줄이고 쿼리의 의미 체계를 유지하는 가능한 모든 연산자를 푸시합니다. 예를 들어 동일한 구체화된 식 위에 공통 필터를 사용합니다.
  • 피연산자에서 한 번 실행할 수 있는 상호 하위 쿼리가 있는 경우 조인 또는 공용 구조체와 함께 materialize를 사용합니다. 예를 들어 조인/공용 포크 다리입니다. 조인 연산자 사용 예제를 참조하세요.
  • materialize는 캐시된 결과에 이름을 지정하는 경우에만 let 문에서 사용할 수 있습니다. let 문 사용 예제를 참조하세요.)

쿼리 성능 향상의 예

다음 예제에서는 쿼리의 성능을 향상시키는 데 사용할 수 있는 방법을 materialize() 보여 줍니다. 식 _detailed_data 은 함수를 사용하여 materialize() 정의되므로 한 번만 계산됩니다.

let _detailed_data = materialize(StormEvents | summarize Events=count() by State, EventType);
_detailed_data
| summarize TotalStateEvents=sum(Events) by State
| join (_detailed_data) on State
| extend EventPercentage = Events*100.0 / TotalStateEvents
| project State, EventType, EventPercentage, Events
| top 10 by EventPercentage

출력

시스템 상태 EventType EventPercentage 이벤트
하와이 워터스 용오름 100 2
온타리오 호수 해양 뇌우 바람 100 8
알래스카 만 용오름 100 4
대서양 북부 해양 뇌우 바람 95.2127659574468 179
레이크 이리 해양 뇌우 바람 92.5925925925926 25
E PACIFIC 용오름 90 9
미시간 호수 해양 뇌우 바람 85.1648351648352 155
휴런 호수 해양 뇌우 바람 79.3650793650794 50
멕시코 만 해양 뇌우 바람 71.7504332755633 414
하와이 하이 서프 70.0218818380744 320

다음 예제에서는 난수 집합을 생성하고 를 계산합니다.

  • 집합의 고유 값 수(Dcount)
  • 집합의 상위 3개 값
  • 집합에 있는 이러한 모든 값의 합계

이 작업은 일괄 처리를 사용하여 수행하고 구체화할 수 있습니다.

let randomSet = 
    materialize(
        range x from 1 to 3000000 step 1
        | project value = rand(10000000));
randomSet | summarize Dcount=dcount(value);
randomSet | top 3 by value;
randomSet | summarize Sum=sum(value)

결과 집합 1:

Dcount
2578351

결과 집합 2:

9999998
9999998
9999997

결과 집합 3:

합계
15002960543563

materialize() 사용 예제

대부분의 쿼리가 수백만 개의 행의 동적 개체에서 필드를 추출하는 경우 수집 시간에 열을 구체화합니다.

문을 두 번 이상 사용하는 값과 함께 사용 let 하려면 materialize() 함수를 사용합니다. 구체화된 데이터 세트를 줄이고 쿼리의 의미 체계를 유지하는 가능한 모든 연산자를 푸시해 보세요. 예를 들어 필터를 사용하거나 필요한 열만 프로젝트합니다.

    let materializedData = materialize(Table
    | where Timestamp > ago(1d));
    union (materializedData
    | where Text !has "somestring"
    | summarize dcount(Resource1)), (materializedData
    | where Text !has "somestring"
    | summarize dcount(Resource2))

에 대한 Text 필터는 상호이며 구체화 식에 푸시할 수 있습니다. 쿼리에는 열 Timestamp, , TextResource1Resource2만 필요합니다. 구체화된 식 내에 이러한 열을 프로젝스합니다.

    let materializedData = materialize(Table
    | where Timestamp > ago(1d)
    | where Text !has "somestring"
    | project Timestamp, Resource1, Resource2, Text);
    union (materializedData
    | summarize dcount(Resource1)), (materializedData
    | summarize dcount(Resource2))

다음 쿼리와 같이 필터가 동일하지 않은 경우:

    let materializedData = materialize(Table
    | where Timestamp > ago(1d));
    union (materializedData
    | where Text has "String1"
    | summarize dcount(Resource1)), (materializedData
    | where Text has "String2"
    | summarize dcount(Resource2))

결합된 필터가 구체화된 결과를 크게 줄이면 다음 쿼리와 같이 구체화된 결과에 대한 두 필터를 논리적 or 식으로 결합합니다. 그러나 각 공용 구조체에 필터를 유지하여 쿼리의 의미 체계를 유지합니다.

    let materializedData = materialize(Table
    | where Timestamp > ago(1d)
    | where Text has "String1" or Text has "String2"
    | project Timestamp, Resource1, Resource2, Text);
    union (materializedData
    | where Text has "String1"
    | summarize dcount(Resource1)), (materializedData
    | where Text has "String2"
    | summarize dcount(Resource2))