다음을 통해 공유


materialize()

적용 대상: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

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

구문

materialize(expression)

구문 규칙에 대해 자세히 알아봅니다.

매개 변수

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

설명

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

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

참고 항목

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

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

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

출력

State(상태) EventType EventPercentage 이벤트
하와이 워터스 Waterspout 100 2
온타리오 호수 해상 뇌우 바람 100 8
알래스카 만 Waterspout 100 4
대서양 북부 해상 뇌우 바람 95.2127659574468 179
레이크 이리 해상 뇌우 바람 92.5925925925926 25
E PACIFIC Waterspout 90 9
미시간 호수 해상 뇌우 바람 85.1648351648352 155
휴런 호수 해상 뇌우 바람 79.3650793650794 50
멕시코 만 해상 뇌우 바람 71.7504332755633 414
하와이 High Surf 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:

value
9999998
9999998
9999997

결과 집합 3:

Sum
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))