クエリの最適化 - AWS IoT SiteWise

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

クエリの最適化

メタデータフィルター

メタデータまたは 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_serieslatest_value_time_seriesprecomputed_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 キーワードを使用する必要がある場合は、個々の 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 のページサイズを最大値の 20,000 に設定します。これにより、クエリ全体のパフォーマンスが向上します。

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

注記

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