このページでは、クエリを最適化してクエリの効率を向上させる方法について説明します。
シャードの数を増やす
シャードはコンピューティングリソースです。 計算速度は、シャードの数とともに増加します。 システムがシャードごとに最大50万のデータエントリのみをスキャンするようにする必要があります。 シャードを分割して、シャードの数を増やすことができます。 詳細については、「シャードを分割します。」をご参照ください。
重要 シャードを分割することによって生成されたシャードに対して追加料金が発生します。 シャードを分割した後、新しいデータをクエリする場合にのみクエリが高速化されます。 既存のデータは元のシャードに残ります。
時間範囲を短縮し、クエリのデータ量を減らす
- 長い時間範囲は、クエリを遅くする。
計算を高速化する場合は、クエリの時間範囲を短縮できます。
- データ量が大きいと、クエリが遅くなります。
クエリのデータ量を減らすことを推奨します。
データの繰り返し照会
クエリの結果が不正確な場合は、データを繰り返しクエリできます。 クエリを実行するたびに、基盤となるアクセラレーションメカニズムが既存のクエリ結果に基づいてデータを分析します。 したがって、クエリを繰り返すと、より正確な結果が返されます。
分析ステートメントの最適化
時間のかかるクエリ文には、次の特徴があります。
- 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) グループによってuid,province
- 非効率的なクエリ文
* | select province,uid,count (1) province,uid
- 効率的なクエリ文
- 近似関数を使用します。 近似関数のパフォーマンスは、指定された精度の関数のパフォーマンスよりも優れています。 近似関数は速度の精度を犠牲にします。 例:
- 効率的なクエリ文
* | select approx_distinct(ip)
- 非効率的なクエリ文
* | select count(distinct(ip))
- 効率的なクエリ文
- 分析ステートメントでクエリする列のみを指定します。 分析ステートメントでは、計算に必要な列のみをクエリすることをお勧めします。 すべての列をクエリする場合は、検索構文を使用します。 例:
- 効率的なクエリ文
* | 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またはkey: bまたはkey: c | select count (1)
- 非効率的なクエリ文
* | select count (1) where key in ('a','b')
- 効率的なクエリ文