쿼리 최적화 - AWS IoT SiteWise

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

쿼리 최적화

메타데이터 필터

메타데이터 또는 원시 데이터를 쿼리할 때 WHERE 절을 사용하여 메타데이터 필드를 기준으로 필터링하여 스캔되는 데이터의 양을 줄입니다. 다음 연산자를 사용하여 메타데이터 스캔을 제한합니다.

  • 같음(=)

  • 같지 않음(!=)

  • LIKE

  • IN

  • AND

  • OR

속성 속성의 경우 다음 필드를 사용하여 결과를 필터링합니다.

  • double_attribute_value

  • int_attribute_value

  • boolean_attribute_value

  • string_attribute_value

이러한 필드는 속성 유형의 자산 속성에 대해 latest_value_time_series 테이블보다 더 나은 성능을 제공합니다.

참고

연산자 오른쪽에 있는 리터럴을 사용하여 데이터 스캔을 적절하게 제한합니다. 예를 들어 다음 쿼리는 엄격한 문자열 리터럴을 사용하는 것보다 성능이 떨어집니다.

SELECT property_id FROM asset_property WHERE property_name = CONCAT('my', 'property')
예 메타데이터 필터의 경우:
SELECT p.property_name FROM asset_property p WHERE p.property_type = 'attribute' AND p.string_attribute_value LIKE 'my-property-%'

원시 데이터 필터

모든 원시 데이터 테이블(raw_time_series, latest_value_time_series, precomputed_aggregates)에는 해당 행과 연결된 타임스탬프가 있습니다. 메타데이터 필터 외에도 event_timestamp 필드에 WHERE 절 필터를 사용하여 스캔되는 데이터의 양을 줄입니다. 원시 데이터 스캔을 제한하려면 다음 작업을 사용합니다.

  • 같음(=)

  • 큼 (>)

  • 작음(<)

  • 크거나 같음(>=)

  • 작거나 같음(<=)

  • BETWEEN

  • AND

precomputed_aggregates 테이블을 쿼리할 때는 항상 WHERE 절에서 품질 필터를 지정합니다. 이렇게 하면 특히 BAD 또는 데이터를 찾고 있는 경우 쿼리가 스캔하는 UNCERTAIN 데이터의 양이 줄어듭니다. 또한 precomputed_aggregates 테이블을 쿼리할 때 해상도 필터(1m, 15m, 1h 또는 1d)를 사용하는 것이 좋습니다. 해상도 필터를 지정하지 않으면 AWS IoT SiteWise 는 기본적으로 모든 해상도에서 전체 테이블 스캔을 수행하므로 비효율적입니다.

참고

Not equals (!=)OR 연산자는 일반적으로 원시 데이터 스캔에 의미 있는 필터를 적용하지 않습니다. 원시 데이터 값(string_value, double_value 등)에 대한 필터도 원시 데이터 스캔을 제한하지 않습니다.

JOIN 최적화

AWS IoT SiteWise SQL은 JOIN 키워드를 지원하여 두 테이블을 함께 병합합니다. 필드(ON키워드 사용)를 능동적으로 필터링JOIN하는 만 지원됩니다. 전체 데카르트 조인은 금지됩니다.

AWS IoT SiteWise 는 JOIN 키워드JOIN를 사용하지 않고 암시적 도 지원합니다. 이는 서로 다른 메타데이터 테이블 간에, 그리고 메타데이터 테이블과 원시 테이블 간에 허용됩니다. 예를 들어, 쿼리는 다음과 같습니다.

SELECT a.asset_name, p.property_name FROM asset a, asset_property p

이 동등한 쿼리보다 성능이 좋습니다.

SELECT a.asset_name, p.property_name FROM asset a JOIN asset_property p ON a.asset_id = p.asset_id

다음과 같은 암시적 조인이 허용됩니다(O는 허용되고 X는 금지됨).

asset asset_property latest_value_time_series raw_time_series precomputed_aggregates subquery
asset X O O O O X
asset_property O X O O O X
latest_value_time_series O O X X X X
raw_time_series O O X X X X
precomputed_aggregates O O X X X X
subquery X X X X X X

가능한 경우 암시적 JOIN를 사용합니다. JOIN 키워드를 사용해야 하는 경우 개별 JOINed 테이블에 필터를 적용하여 스캔되는 데이터를 최소화합니다. 예를 들어이 쿼리 대신 다음을 수행합니다.

SELECT level1.asset_id, level2.asset_id, level3.asset_id FROM asset AS level1 JOIN asset AS level2 ON level2.parent_asset_id = level1.asset_id JOIN asset AS level3 ON level3.parent_asset_id = level2.asset_id WHERE level1.asset_name LIKE 'level1%' AND level2.asset_name LIKE 'level2%' AND level3.asset_name LIKE 'level3%'

이 보다 효율적인 쿼리를 사용합니다.

SELECT level1.asset_id, level2.asset_id, level3.asset_id FROM asset AS level1 JOIN (SELECT asset_id, parent_asset_id FROM asset WHERE asset_name LIKE 'level2%') AS level2 ON level2.parent_asset_id = level1.asset_id JOIN (SELECT asset_id, parent_asset_id FROM asset WHERE asset_name LIKE 'level3%') AS level3 ON level3.parent_asset_id = level2.asset_id WHERE level1.asset_name LIKE 'level1%'

메타데이터 필터를 하위 쿼리로 푸시하면 스캔 프로세스 중에의 개별 테이블이 필터링JOIN됩니다. 동일한 효과를 위해 하위 쿼리에서 LIMIT 키워드를 사용할 수도 있습니다.

대규모 쿼리

기본값보다 많은 행을 생성하는 쿼리의 경우 ExecuteQuery API의 페이지 크기를 최대값 20000으로 설정합니다. 이렇게 하면 전체 쿼리 성능이 향상됩니다.

LIMIT 절을 사용하여 일부 쿼리에 대해 스캔되는 데이터의 양을 줄입니다. 집계 함수와 특정 테이블 전체 절(GROUP BY, ORDER BY, JOIN)은 LIMIT 절을 적용하기 전에 전체 스캔을 완료해야 합니다.

참고

AWS IoT SiteWise 는 LIMIT 절이 적용된 상태에서도 최소량의 데이터를 스캔할 수 있으며, 특히 여러 속성을 스캔하는 원시 데이터 쿼리의 경우 더욱 그렇습니다.