materialize()
적용 대상: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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
, 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))