查詢最佳化 - AWS IoT SiteWise

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

查詢最佳化

中繼資料篩選條件

當您查詢中繼資料或原始資料時,請使用 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_time_serieslatest_value_time_seriesprecomputed_aggregates) 都有與其資料列相關聯的時間戳記。除了中繼資料篩選條件之外,在 event_timestamp 欄位中使用WHERE子句篩選條件來減少掃描的資料量。使用下列操作來限制原始資料掃描:

  • 等於 (=)

  • 大於 (>)

  • 小於 (<)

  • 大於或等於 (>=)

  • 小於或等於 (<=)

  • BETWEEN

  • AND

查詢 precomputed_aggregates 資料表時,請務必在 WHERE子句中指定品質篩選條件。這可減少查詢掃描的資料量,尤其是在尋找 BADUNCERTAIN資料時。我們也強烈建議在查詢 precomputed_aggregates 資料表時使用解析度篩選條件 (1 公尺、15 公尺、1 小時或 1 天)。如果您未指定解析度篩選條件, AWS IoT SiteWise 會預設為對所有解析度進行完整資料表掃描,這是無效的。

注意

不等於 (!=)OR運算子通常不會將有意義的篩選條件套用至原始資料掃描。篩選原始資料值 (string_value、double_value 等) 也不會限制原始資料掃描。

JOIN 最佳化

AWS IoT SiteWise SQL 支援將兩個資料表合併在一起的JOIN關鍵字。僅支援JOIN主動篩選欄位 (使用ON關鍵字) 的 。禁止完整笛卡爾聯結。

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_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 的頁面大小設定為最大值 20000。這可改善整體查詢效能。

使用 LIMIT子句來減少針對某些查詢掃描的資料量。請注意,彙總函數和某些全資料表子句 (GROUP BYORDER BYJOIN) 需要完整掃描才能套用子LIMIT句。

注意

AWS IoT SiteWise 即使套用 LIMIT子句, 也可能會掃描最少量的資料,尤其是掃描多個屬性的原始資料查詢。