次の方法を使用して、ログのクエリと分析を高速化できます。
シャードの数を増やすか、専用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')