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 t1 つ以上の文字列型の列で分析結果をグループ化しないでください。
たとえば、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')