

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# クエリの最適化
<a name="query-optimize"></a>

## メタデータフィルター
<a name="metadata-filters"></a>

メタデータまたは raw データをクエリするときは、 `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')
```

**Example メタデータフィルターの場合:**  

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

## Raw データフィルター
<a name="raw-data-filters"></a>

すべての raw データテーブル (**raw\_time\_series**、 **latest\_value\_time\_series**、**precomputed\_aggregates**) には、行に関連付けられたタイムスタンプがあります。メタデータフィルターに加えて、 `event_timestamp`フィールドで`WHERE`句フィルターを使用して、スキャンされるデータの量を減らします。次のオペレーションを使用して、raw データスキャンを制限します。
+ 等しい (=)
+ Greater than (>)
+ 未満 (<)
+ 以上 (>=)
+ 以下 (<=)
+ BETWEEN
+ AND

**フィルターの例**:
+  **precomputed\_aggregates** テーブルをクエリするときは、常に `WHERE`句で品質フィルターを指定します。これにより、クエリがスキャンするデータの量が減少します。特に `BAD`または `UNCERTAIN` データを探している場合です。

   **precomputed\_aggregates** テーブルをクエリするときは、解像度フィルター (1m、15m、1h、または 1d) を使用することを強くお勧めします。解像度フィルターを指定しない場合、 AWS IoT SiteWise はデフォルトですべての解像度で完全なテーブルスキャンを行います。これは非効率です。
+  raw データをクエリする場合、タイムスタンプ関数を `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())
  ```

**注記**  
等しくなく`(!=)`、`OR`演算子は通常、raw データスキャンに意味のあるフィルターを適用しません。raw データ値 (string\_value、double\_value など) のフィルタも raw データスキャンを制限しません。

## JOIN 最適化
<a name="join-optimization"></a>

AWS IoT SiteWise SQL は、2 つのテーブルをマージする `JOIN`キーワードをサポートします。( `ON`キーワードを使用して) フィールドでアクティブにフィルタリング`JOIN`する のみがサポートされます。フルデカルト結合は禁止されています。

AWS IoT SiteWise は、 `JOIN`キーワードを使用せずに暗黙`JOIN`的な もサポートしています。これらは、異なるメタデータテーブル間、およびメタデータテーブルと raw テーブル間で許可されます。例えば、次のクエリは、

```
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\_property | latest\_value\_time\_series | raw\_time\_series | precomputed\_aggregates | subquery | 
| --- | --- | --- | --- | --- | --- | --- | 
| アセット | 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 のページサイズを最大値の 20,000 に設定します。これにより、全体的なクエリパフォーマンスが向上します。

一部のクエリでスキャンされるデータの量を減らすには、 `LIMIT`句を使用します。集計関数と特定のテーブル全体の句 (`GROUP BY`、`ORDER BY`、`JOIN`) では、`LIMIT`句を適用する前にフルスキャンを完了する必要があります。

**注記**  
 AWS IoT SiteWise は、 `LIMIT`句が適用されていても、特に複数のプロパティをスキャンする未加工データクエリの場合、最小量のデータをスキャンすることがあります。