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
, , Text
Resource1
및 Resource2
만 필요합니다. 구체화된 식 내에 이러한 열을 프로젝스합니다.
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))
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기