

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

# 쿼리 최적화
<a name="query-optimize"></a>

## 메타데이터 필터
<a name="metadata-filters"></a>

메타데이터 또는 원시 데이터를 쿼리할 때 `WHERE` 절을 사용하여 메타데이터 필드를 기준으로 필터링하여 스캔되는 데이터의 양을 줄입니다. 다음 연산자를 사용하여 메타데이터 스캔을 제한합니다.
+ 같음(=)
+ 같지 않음(\!=)
+ LIKE
+ IN
+ AND
+ 또는

속성 속성의 경우 다음 필드를 사용하여 결과를 필터링합니다.
+ `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')
```

**Example 메타데이터 필터의 경우:**  

```
SELECT p.property_name FROM asset_property p
WHERE p.property_type = 'attribute' AND p.string_attribute_value LIKE 'my-property-%'
```

## 원시 데이터 필터
<a name="raw-data-filters"></a>

모든 원시 데이터 테이블(**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 는 기본적으로 모든 해상도에서 전체 테이블 스캔을 수행하므로 비효율적입니다.
+  원시 데이터를 쿼리할 때 `WHERE` 절에서 타임스탬프 함수를 사용하여 스캔한 데이터의 양을 필터링할 수도 있습니다. 예를 들어 다음 쿼리는 **raw\_time\_series** 테이블에서 지난 30분 동안의 데이터만 스캔합니다.

  ```
  SELECT r.event_timestamp, r.double_value
  FROM raw_time_series r
  WHERE r.event_timestamp > TIMESTAMP_SUB(MINUTE, 30, NOW())
  ```

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

## JOIN 최적화
<a name="join-optimization"></a>

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` 키워드를 사용해야 하는 경우 개별 `JOIN`ed 테이블에 필터를 적용하여 스캔되는 데이터를 최소화합니다. 예를 들어이 쿼리 대신 다음을 수행합니다.

```
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` 키워드를 사용할 수도 있습니다.

## 대규모 쿼리
<a name="large-queries"></a>

기본값보다 많은 행을 생성하는 쿼리의 경우 [ExecuteQuery](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_ExecuteQuery.html) API의 페이지 크기를 최대값 20000으로 설정합니다. 이렇게 하면 전체 쿼리 성능이 향상됩니다.

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

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