翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
クエリの最適化
メタデータフィルター
メタデータまたは raw データをクエリする場合は、 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')
例 メタデータフィルターの場合:
SELECT p.property_name FROM asset_property p WHERE p.property_type = 'attribute' AND p.string_attribute_value LIKE 'my-property-%'
Raw データフィルター
すべての 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 はデフォルトですべての解像度で完全なテーブルスキャンを行います。これは非効率です。
注記
等しくなく(!=)
、OR
演算子は通常、raw データスキャンに意味のあるフィルターを適用しません。raw データ値 (string_value、double_value など) のフィルタも raw データスキャンを制限しません。
JOIN 最適化
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
キーワードを使用することもできます。
大きなクエリ
デフォルトよりも多くの行を生成するクエリの場合は、ExecuteQuery API のページサイズを最大値の 20,000 に設定します。これにより、クエリ全体のパフォーマンスが向上します。
LIMIT
句を使用して、一部のクエリでスキャンされるデータの量を減らします。集計関数と特定のテーブル全体の句 (GROUP BY
、ORDER BY
、JOIN
) では、 LIMIT
句を適用する前にフルスキャンを完了する必要があります。
注記
AWS IoT SiteWise は、 LIMIT
句が適用されていても、特に複数のプロパティをスキャンする raw データクエリの場合、最小量のデータをスキャンすることがあります。