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

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

最終更新日:Sep 01, 2026

Simple Log Service (SLS) でログのクエリと分析を高速化するには、以下の方法があります。

シャード数の増加または専用 SQL の有効化

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

  • 専用 SQL は、高い同時実行と大規模なデータスキャンをサポートします。

時間範囲の短縮とデータ量の削減

  • 時間範囲が長いと、クエリ操作が遅くなります。

    計算速度を上げたい場合は、クエリ操作の時間範囲を短縮してください。

  • データ量が多いと、クエリ操作が遅くなります。

    クエリ操作のデータ量を減らしてください。

クエリの繰り返し

クエリ結果が不正確な場合は、データを繰り返しクエリできます。クエリ操作を実行するたびに、内部の高速化メカニズムが既存のクエリ結果を分析します。データを繰り返しクエリすると、システムはより正確な結果を返すことができます。

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

時間のかかるクエリステートメントには、次の特徴があります:

  • GROUP BY 句を使用して、1 つ以上の文字列型の列に基づいて分析結果をグループ化していること。

  • GROUP BY 句を使用して、6 つ以上の列に基づいて分析結果をグループ化していること。

  • 文字列を生成する操作がステートメントに含まれていること。

次の方法で分析ステートメントを最適化できます:

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

    たとえば、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 フィールドの値の種類が 1 億の場合、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 列とユーザー名列の値は互いに対応している必要があります。データをグループ化するには、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')