KQL を効果的に使用する

完了

Eventhouses を使用する場合、優れたパフォーマンスを得るために、効率的な KQL クエリを記述する方法を理解することが不可欠です。 このユニットでは、主要な最適化手法について説明し、それらがクエリにとって重要な理由について説明します。

クエリの最適化が重要な理由

KQL データベースのクエリ パフォーマンスは、処理されるデータの量によって異なります。 KQL がデータを処理する方法を理解したら、次のクエリを記述できます。

  • スキャンされるデータを減らすことで、より高速に実行できます。たとえば、数百万行をスキャンする代わりに、数千行のみを処理するように早期にフィルター処理します
  • 使用するリソースの数を減らす - たとえば、50 列すべてではなく 3 つの列のみを選択すると、処理のオーバーヘッドが削減されます
  • データの増加に確実に対応 する - たとえば、現在 100 万行で動作するクエリは、データが 1,000 万行に拡大しても引き続き良好に動作します

重要な原則は、クエリで処理する必要があるデータが少ないほど、実行速度が速くなることです。

主要な最適化手法を理解する

データを早期かつ効果的にフィルター処理する

フィルター処理により、後続の操作で処理する必要があるデータの量が減り、KQL データベースではインデックスとデータ編成手法が使用され、早期フィルター処理が特に効率的になります。

Eventhouse には通常、時系列データが含まれているため、時間ベースのフィルター処理が有効です。

TaxiTrips
| where pickup_datetime > ago(30min)  // Filter first - uses time index
| project trip_id, vendor_id, pickup_datetime, fare_amount
| summarize avg_fare = avg(fare_amount) by vendor_id

削除するデータの量に応じてフィルターを並 べ替え、最も多くのデータを排除するフィルターを最初に配置します。 じょうごのように考えます。最も多くの行を削除するフィルターから始めて、残りのデータにさらに具体的なフィルターを適用します。

TaxiTrips
| where pickup_datetime > ago(1d)    // Time filter first - eliminates most data
| where vendor_id == "VTS"           // Specific vendor - eliminates some data  
| where fare_amount > 0              // Value filter - eliminates least data
| summarize trip_count = count()

列を早期に減らす

必要な 列のみを投影または選択すると、リソースの使用量が削減されます。 これは、多数の列を持つワイド テーブルを操作する場合に特に重要です。

TaxiTrips
| project trip_id, pickup_datetime, fare_amount  // Select columns early
| where pickup_datetime > ago(1d)                // Then filter
| summarize avg_fare = avg(fare_amount)

集計と結合を最適化する

集計と結合は、大量のデータを処理して結合する必要があるため、リソースを集中的に使用する操作です。 それらを構成する方法は、クエリのパフォーマンスに大きな影響を与える可能性があります。

集計の場合は、データを探索するときに結果を制限します

TaxiTrips
| where pickup_datetime > ago(1d)
| summarize trip_count = count() by trip_id, vendor_id
| limit 1000  // Limit results for exploration

結合の場合は、小さいテーブルを最初に配置します。 テーブルを結合すると、KQL は最初のテーブルを 2 番目のテーブルと一致するように処理します。 小さいテーブルから始めると、処理する行が少なくなり、結合の効率が向上します。

// Good: Small vendor table first
VendorInfo        
| join kind=inner TaxiTrips on vendor_id

// Avoid: Large taxi table first
TaxiTrips         
| join kind=inner VendorInfo on vendor_id