すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:ログのクエリと分析を高速化

最終更新日:Sep 23, 2024

次の方法を使用して、ログのクエリと分析を高速化できます。

シャードの数を増やすか、専用SQLを有効にする

  • シャードの数を増やして、データの読み取りおよび書き込み機能を向上させることができます。 ただし、この方法は増分データに対してのみ有効です。 シャードはコンピューティングリソースです。 計算速度は、シャードの数に基づいて増加します。 シャードごとにスキャンされるデータエントリの数が50万を超えないようにしてください。 シャードを分割して、シャードの数を増やすことができます。 詳細については、「シャードの分割」をご参照ください。 シャードの課金の詳細については、「課金方法に基づくアクティブなシャードの課金例」をご参照ください。

  • Dedicated SQLは、多数の同時分析操作とスキャン用の大量のデータをサポートします。 詳細については、「Dedicated SQLの有効化」をご参照ください。

クエリ操作の時間範囲を短縮し、データ量を減らす

  • 長い時間範囲は、クエリ操作を遅くする。

    計算速度を高速化したい場合は、クエリ操作の時間範囲を短くすることができます。

  • 大量のデータを使用すると、クエリ操作が遅くなります。

    クエリ操作のデータ量を減らすことを推奨します。

データを繰り返し照会する

クエリ結果が不正確な場合は、データを繰り返しクエリできます。 クエリ操作を実行するたびに、基盤となるアクセラレーションメカニズムが既存のクエリ結果を分析します。 データを繰り返しクエリすると、システムはより正確な結果を返すことができます。

分析ステートメントの最適化

時間のかかるクエリ文には、次の特徴があります。

  • GROUP BY句は、文字列型の1つ以上の列に基づいて分析結果をグループ化するために使用されます。

  • GROUP BY句は、5つ以上の列に基づいて分析結果をグループ化するために使用されます。

  • 文には、文字列を生成する操作が含まれます。

次の方法を使用して、分析ステートメントを最適化できます。

  • 文字列を生成する操作を含めないでください。

    たとえば、date_format関数を使用して指定された形式のタイムスタンプを生成すると、クエリの効率は低くなります。 date_truncまたはtime_series関数を使用してタイムスタンプを生成することを推奨します。 例:

    * | select date_format(from_unixtime(__time__) , '%H_%i') as t, count(1) group by t
  • 文字列型の1つ以上の列に基づいて分析結果をグループ化しないでください。

    たとえば、GROUP BY句を使用して、文字列型の1つ以上の列に基づいて分析結果をグループ化すると、ハッシュ計算の作業負荷が大きくなります。 ハッシュ計算のワークロードは、計算のワークロード全体の50% 以上を占めます。 例:

    • 効率的なクエリ文

      * | select count(1) as pv , from_unixtime(__time__-__time__%3600) as time group by __time__-__time__%3600
    • 非効率的なクエリ文

      * | select count(1) as pv , date_trunc('hour',__time__) as time group by time

    2つのクエリステートメントは、1時間あたりのログ数を計算するために使用されます。 2番目のステートメントでは、タイムスタンプが文字列に変換されます。 そして、解析結果は、文字列に基づいてグループ化される。 たとえば、2021-12-12 00:00:00は文字列形式のタイムスタンプです。 最初のステートメントでは、時間のタイムスタンプが取得され、分析結果がタイムスタンプに基づいてグループ化され、タイムスタンプが文字列に変換されます。

  • 複数の列に基づいて分析結果をグループ化する場合は、値の数が多いフィールドを、値の数が少ないフィールドの前に配置することをお勧めします。

    たとえば、特定のフィールドの値の数が13で、uidフィールドの値の数が100万である場合、GROUP BY句の特定のフィールドの前にuidフィールドを配置することを推奨します。 例:

    • 効率的なクエリ文

      * | select province,uid,count(1) group by uid,province
    • 非効率的なクエリ文

       * | select province,uid,count(1) group by province,uid
  • 近似関数を使用します。

    近似関数のパフォーマンスは、精度を指定した関数のパフォーマンスよりも優れています。 近似関数は速度の精度を犠牲にします。 例:

    • 効率的なクエリ文

       * |select approx_distinct(ip)
    • 非効率的なクエリ文

       * | select count(distinct(ip))
  • 分析ステートメントでクエリする列のみを指定します。 すべての列を照会しないでください。

    分析ステートメントでは、計算に必要な列のみをクエリすることをお勧めします。 すべての列をクエリする場合は、検索構文を使用します。 例:

    • 効率的なクエリ文

      * |select a,b c 
    • 非効率的なクエリ文

      * |select *
  • グループ化に使用されない列を集計関数に配置します。

    たとえば、userid列とusername列の値が一致している必要があります。 データをグループ化するには、GROUP BY句でuserid列を指定するだけです。 例:

    • 効率的なクエリ文

       * | select userid, arbitrary(username), count(1) group by userid 
    • 非効率的なクエリ文

      * | select userid, username, count(1) group by userid,username
  • IN句を使用しないでください。

    分析ステートメントでIN句を使用しないことをお勧めします。 検索文でOR句を使用できます。 例:

    • 効率的なクエリ文

      key: a or key: b or key: c | select count(1)
    • 非効率的なクエリ文

      * | select count(1) where key in ('a','b')