다음을 통해 공유


FHIR 쿼리 폴딩

파워 쿼리 폴딩 은 파워 쿼리 커넥터에서 데이터 변환을 데이터 원본으로 전송되는 쿼리로 전환하는 데 사용하는 메커니즘입니다. 이 접기 메커니즘을 통해 파워 쿼리는 클라이언트에서 데이터 선택을 해제하기 위해 많은 양의 불필요한 데이터를 검색하지 않고 데이터 원본에 가능한 한 많은 데이터 선택을 오프로드할 수 카드 있습니다. FHIR용 파워 쿼리 커넥터에는 쿼리 폴딩 기능이 포함되어 있지만 FHIR 검색특성상 가능하면 쿼리 폴딩이 수행되도록 파워 쿼리 식에 특히 주의해야 합니다. 이 문서에서는 FHIR 파워 쿼리 접기의 기본 사항을 설명하고 지침 및 예제를 제공합니다.

FHIR 및 쿼리 폴딩

FHIR 서버에서 "환자" 리소스를 검색하는 쿼리를 생성하고 있으며 1980년 이전에 태어난 환자에 관심이 있다고 가정해 보겠습니다. 이러한 쿼리는 다음과 같습니다.

let
    Source = Fhir.Contents("https://myfhirserver.azurehealthcareapis.com", null),
    Patient1 = Source{[Name="Patient"]}[Data],
    #"Filtered Rows" = Table.SelectRows(Patient1, each [birthDate] < #date(1980, 1, 1))
in
    #"Filtered Rows"

FHIR 서버에서 모든 환자 리소스를 검색하고 클라이언트(Power BI)에서 필터링하는 대신 검색 매개 변수가 있는 쿼리를 FHIR 서버로 보내는 것이 더 효율적입니다.

GET https://myfhirserver.azurehealthcareapis.com/Patient?birthdate=lt1980-01-01

이러한 쿼리를 사용하면 클라이언트는 관심 있는 환자만 받게 되며 클라이언트에서 데이터를 카드 필요가 없습니다.

생년월일 예제에서 쿼리 폴딩은 간단합니다. 그러나 일반적으로 FHIR에서는 검색 매개 변수 이름이 항상 데이터 필드 이름과 일치하지 않으며 여러 데이터 필드가 단일 검색 매개 변수에 기여하는 경우가 많습니다.

예를 들어 리소스와 category 필드를 살펴보겠습니다Observation. Observation.category 필드는 필드가 CodeableConcept 있고 필드 systemcode 가 있는 coding FHIR(다른 필드 중)입니다. 활력 징후에만 관심이 있다고 가정해 보겠습니다. 관찰 위치에 Observation.category.coding.code = "vital-signs"관심이 있지만 FHIR 검색은 다음과 같습니다 https://myfhirserver.azurehealthcareapis.com/Observation?category=vital-signs.

더 복잡한 경우 쿼리 폴딩을 수행할 수 있도록 FHIR용 파워 쿼리 커넥터는 파워 쿼리 식과 식 패턴 목록을 일치시키고 적절한 검색 매개 변수로 변환합니다. 식 패턴은 FHIR 사양에서 생성됩니다.

식 패턴과의 일치는 데이터의 다른 셰이핑 전에 데이터 변환 단계에서 가능한 한 빨리 선택 식(필터링)이 수행되는 경우에 가장 적합합니다.

참고 항목

파워 쿼리 엔진이 쿼리 폴딩을 수행할 수 있는 최상의 기회를 제공하려면 데이터를 셰이핑하기 전에 모든 데이터 선택 식을 수행해야 합니다.

쿼리 폴딩 예제

효율적인 쿼리 폴딩을 설명하기 위해 관찰 리소스에서 모든 활력 징후를 가져오는 예제를 안내합니다. 이 작업을 수행하는 직관적인 방법은 먼저 필드를 확장한 Observation.category 다음, 확장 Observation.category.coding 한 다음 필터링하는 것입니다. 쿼리는 다음과 같습니다.

// Inefficient Power Query
let
    Source = Fhir.Contents("https://myfhirserver.azurehealthcareapis.com", null),
    Observation = Source{[Name="Observation"]}[Data],
    ExpandCategory = Table.ExpandTableColumn(Observation, "category", {"coding"}, {"category.coding"}),
    ExpandCoding = Table.ExpandTableColumn(ExpandCategory, "category.coding", {"system", "code"}, {"category.coding.system", "category.coding.code"}),
    FilteredRows = Table.SelectRows(ExpandCoding, each ([category.coding.code] = "vital-signs"))
in
    FilteredRows

안타깝게도 파워 쿼리 엔진은 더 이상 검색 매개 변수에 category 매핑되는 선택 패턴으로 인식되지 않지만 쿼리를 다음과 같이 재구성하는 경우

// Efficient Power Query allowing folding
let
    Source = Fhir.Contents("https://myfhirserver.azurehealthcareapis.com", null),
    Observation = Source{[Name="Observation"]}[Data],
    FilteredObservations = Table.SelectRows(Observation, each Table.MatchesAnyRows([category], each Table.MatchesAnyRows([coding], each [code] = "vital-signs"))),
    ExpandCategory = Table.ExpandTableColumn(FilteredObservations, "category", {"coding"}, {"category.coding"}),
    ExpandCoding = Table.ExpandTableColumn(ExpandCategory, "category.coding", {"system", "code"}, {"category.coding.system", "category.coding.code"})
in
    ExpandCoding

검색 쿼리 /Observation?category=vital-signs 는 FHIR 서버로 전송되므로 클라이언트가 서버에서 받는 데이터의 양이 줄어듭니다.

첫 번째 및 두 번째 파워 쿼리 식은 동일한 데이터 집합을 생성하지만, 후자는 일반적으로 쿼리 성능이 향상됩니다. 쿼리의 두 번째, 더 효율적인 버전은 GUI(그래픽 사용자 인터페이스)를 사용하여 데이터 셰이핑을 통해서만 가져올 수 없다는 점에 유의해야 합니다. 파워 쿼리 고급 편집기에서 쿼리를 작성해야 합니다.

초기 데이터 탐색은 GUI 쿼리 편집기를 사용하여 수행할 수 있지만 쿼리 폴딩을 염두에 두고 쿼리를 리팩터링하는 것이 좋습니다. 특히 선택적 쿼리(필터링)는 가능한 한 빨리 수행해야 합니다.

접기 패턴 찾기

FHIR용 파워 쿼리 커넥터는 파워 쿼리 식이 FHIR 사양에 정의된 알려진 검색 매개 변수에 매핑되는 경우에만 쿼리 폴딩을 수행할 수 있습니다. 쿼리 폴딩이 가능한지 궁금한 경우 FHIR 사양을 참조하는 것이 좋습니다. 각 리소스에는 사양 페이지 아래쪽에 대한 검색 매개 변수 집합이 나열됩니다. 접이 식 쿼리 패턴 페이지에서 FHIR용 접이식 파워 쿼리 식을 작성하는 방법에 대한 예제를 참조할 수도 있습니다.

쿼리 폴딩 디버깅

지정된 파워 쿼리 식이 접히는지 여부와 결과 FHIR 검색 식이 무엇인지 확인하려는 경우 Power BI Desktop에서 쿼리를 셰이핑하는 동안 Fiddler를 시작할 수 있습니다.

요약

쿼리 폴딩은 보다 효율적인 파워 쿼리 식을 제공합니다. 올바르게 작성된 파워 쿼리를 사용하면 쿼리를 접을 수 있으므로 데이터 필터링 부담의 상당 부분을 데이터 원본으로 오프로드할 수 있습니다.

다음 단계

이 문서에서는 FHIR용 파워 쿼리 커넥터에서 쿼리 폴딩을 사용하는 방법을 알아보았습니다. 다음으로, FHIR 파워 쿼리 폴딩 패턴 목록을 살펴봅니다.