このトピックでは、ハイブリッドプラン機能について説明します。動作方法、適切なシナリオ、制限、パフォーマンス改善効果などがあります。
ハイブリッドプランの仕組み
ワイドテーブルの少数の列に対してWHERE、JOIN、またはLIMIT句を使用するクエリの場合、インメモリ列インデックス (IMCI) はクエリのパフォーマンスを大幅に向上させることができます。 ただし、フィルタリングされた列の詳細を含むクエリでIMCIを使用する場合、プロジェクトはすべての列情報を取得する必要があり、読み取りワークロードが過剰になります。 この場合、行インデックスがより適しています。 クエリで列インデックス作成と行インデックス作成の両方を組み合わせるメソッドは、ハイブリッドプランと呼ばれます。
ハイブリッドプランは、ワイドテーブルクエリを高速化します。 IMCIは、列インデックスがうまく機能する実行計画の部分で実行し、中間結果を取得するために使用されます。 中間結果は、主キー情報のみを含む。 次に、前の図に示すように、InnoDBエンジンのプライマリキーとプライマリインデックスに基づいて、プロジェクト内のすべての列情報がクエリされ、返されます。
シナリオ
クエリはワイドテーブル上にあり、結果には15を超える列が含まれます。
前提条件
クラスターはEnterprise Editionで、リビジョンバージョンが8.0.1.1.37以降のPolarDB for MySQL 8.0.1を実行します。
制限事項
ハイブリッドプランに基づくクエリに関連するテーブルには、プライマリキーが明示的に定義されている必要があります。
パーティションテーブルでハイブリッドプランを使用することはできません。
ハイブリッドプラン機能がテーブルタイプなどの制限により低速クエリを高速化できない場合は、テクニカルサポートについてお問い合わせください。
Parameters
ハイブリッドプラン機能を有効にするには、imci_enable_hybrid_plan
パラメーターをONに設定します。 ハイブリッドプラン機能を有効にすると、オプティマイザは適切なクエリステートメントでこの機能を使用して、ワイドテーブルクエリを高速化します。 特定のクエリステートメントに対してハイブリッドプラン機能を強制的に使用するには、クエリステートメントにヒントを追加して、imci_optimizer_switch
パラメーターのforce_hybrid_index_search
オプションをONに設定します。
パラメーター | 説明 |
imci_enable_hybrid_plan | ハイブリッドプラン機能を有効にするかどうかを指定します。 有効な値:
|
imci_optimizer_switch | 条件を満たすクエリ文でハイブリッドプランを使用するかどうかを指定します。 有効な値:
|
手順
次のセクションでは、ハイブリッドプラン機能を使用して、ワイドテーブルでSELECT * FROM t1;
ステートメントの実行を高速化する方法について説明します。 以下の手順を実行します。
PolarDBクラスターに接続します。 詳細については、「クラスターへの接続」をご参照ください。
imci_enable_hybrid_plan
パラメーターをONに設定して、ハイブリッドプラン機能を有効にします。 ハイブリッドプラン機能を有効にすると、オプティマイザは適切なクエリステートメントでこの機能を使用して、ワイドテーブルクエリを高速化します。SET imci_enable_hybrid_plan=ON;
特定のクエリに対してハイブリッドプラン機能を強制的に使用するには、SQL文にヒントを追加して、
imci_optimizer_switch
パラメーターのforce_hybrid_index_search
オプションをONに設定します。SELECT /* + SET_VAR(imci_optimizer_switch='force_hybrid_index_search=ON') */ * FROM t1;
EXPLAINステートメントを使用して、ハイブリッドプラン機能がSQLステートメントで有効になっているかどうかを確認できます。 実行プランにHybridIndexSearchが含まれている場合、ハイブリッドプラン機能がSQL文で有効になっています。
EXPLAIN SELECT /* + SET_VAR(imci_optimizer_switch='force_hybrid_index_search=ON') */ * FROM t1;
サンプル結果:
+----+-------------------------+------+---------------------------------------------------------------+ | ID | Operator | Name | Extra Info | +----+-------------------------+------+---------------------------------------------------------------+ | 1 | Select Statement | | IMCI Execution Plan (max_dop = 32, max_query_mem = unlimited) | | 2 | └─HybridIndexSearch | | Used table: t1 | | 3 | └─Compute Scalar | | | | 4 | └─Table Scan | t1 | | +----+-------------------------+------+---------------------------------------------------------------+ 4 rows in set (0.02 sec)
パフォーマンステスト
次のテストでは、ClickHouseのOnTimeデータセットを使用して、次のシナリオでクエリのパフォーマンスを比較します。IMCIまたはハイブリッドプラン機能を使用せず、IMCIのみを使用し、ハイブリッドプラン機能を使用します。
OnTimeデータセットのテーブルは、109列を含む一般的なワイドテーブルです。 このテストでは、テーブルの定義が変更され、新しい主キーが明示的に定義されます。 次のステートメントは、変更されたスキーマについて説明します。
CREATE TABLE `ontime` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Year` year(4) DEFAULT NULL,
`Quarter` tinyint(4) DEFAULT NULL,
`Month` tinyint(4) DEFAULT NULL,
`DayofMonth` tinyint(4) DEFAULT NULL,
`DayOfWeek` tinyint(4) DEFAULT NULL,
`FlightDate` date DEFAULT NULL,
`UniqueCarrier` char(7) DEFAULT NULL,
`AirlineID` int(11) DEFAULT NULL,
`Carrier` char(2) DEFAULT NULL,
`TailNum` varchar(50) DEFAULT NULL,
`FlightNum` varchar(10) DEFAULT NULL,
`OriginAirportID` int(11) DEFAULT NULL,
`OriginAirportSeqID` int(11) DEFAULT NULL,
`OriginCityMarketID` int(11) DEFAULT NULL,
`Origin` char(5) DEFAULT NULL,
`OriginCityName` varchar(100) DEFAULT NULL,
`OriginState` char(2) DEFAULT NULL,
`OriginStateFips` varchar(10) DEFAULT NULL,
`OriginStateName` varchar(100) DEFAULT NULL,
`OriginWac` int(11) DEFAULT NULL,
`DestAirportID` int(11) DEFAULT NULL,
`DestAirportSeqID` int(11) DEFAULT NULL,
`DestCityMarketID` int(11) DEFAULT NULL,
`Dest` char(5) DEFAULT NULL,
`DestCityName` varchar(100) DEFAULT NULL,
`DestState` char(2) DEFAULT NULL,
`DestStateFips` varchar(10) DEFAULT NULL,
`DestStateName` varchar(100) DEFAULT NULL,
`DestWac` int(11) DEFAULT NULL,
`CRSDepTime` int(11) DEFAULT NULL,
`DepTime` int(11) DEFAULT NULL,
`DepDelay` int(11) DEFAULT NULL,
`DepDelayMinutes` int(11) DEFAULT NULL,
`DepDel15` int(11) DEFAULT NULL,
`DepartureDelayGroups` int(11) DEFAULT NULL,
`DepTimeBlk` varchar(20) DEFAULT NULL,
`TaxiOut` int(11) DEFAULT NULL,
`WheelsOff` int(11) DEFAULT NULL,
`WheelsOn` int(11) DEFAULT NULL,
`TaxiIn` int(11) DEFAULT NULL,
`CRSArrTime` int(11) DEFAULT NULL,
`ArrTime` int(11) DEFAULT NULL,
`ArrDelay` int(11) DEFAULT NULL,
`ArrDelayMinutes` int(11) DEFAULT NULL,
`ArrDel15` int(11) DEFAULT NULL,
`ArrivalDelayGroups` int(11) DEFAULT NULL,
`ArrTimeBlk` varchar(20) DEFAULT NULL,
`Cancelled` tinyint(4) DEFAULT NULL,
`CancellationCode` char(1) DEFAULT NULL,
`Diverted` tinyint(4) DEFAULT NULL,
`CRSElapsedTime` int(11) DEFAULT NULL,
`ActualElapsedTime` int(11) DEFAULT NULL,
`AirTime` int(11) DEFAULT NULL,
`Flights` int(11) DEFAULT NULL,
`Distance` int(11) DEFAULT NULL,
`DistanceGroup` tinyint(4) DEFAULT NULL,
`CarrierDelay` int(11) DEFAULT NULL,
`WeatherDelay` int(11) DEFAULT NULL,
`NASDelay` int(11) DEFAULT NULL,
`SecurityDelay` int(11) DEFAULT NULL,
`LateAircraftDelay` int(11) DEFAULT NULL,
`FirstDepTime` varchar(10) DEFAULT NULL,
`TotalAddGTime` varchar(10) DEFAULT NULL,
`LongestAddGTime` varchar(10) DEFAULT NULL,
`DivAirportLandings` varchar(10) DEFAULT NULL,
`DivReachedDest` varchar(10) DEFAULT NULL,
`DivActualElapsedTime` varchar(10) DEFAULT NULL,
`DivArrDelay` varchar(10) DEFAULT NULL,
`DivDistance` varchar(10) DEFAULT NULL,
`Div1Airport` varchar(10) DEFAULT NULL,
`Div1AirportID` int(11) DEFAULT NULL,
`Div1AirportSeqID` int(11) DEFAULT NULL,
`Div1WheelsOn` varchar(10) DEFAULT NULL,
`Div1TotalGTime` varchar(10) DEFAULT NULL,
`Div1LongestGTime` varchar(10) DEFAULT NULL,
`Div1WheelsOff` varchar(10) DEFAULT NULL,
`Div1TailNum` varchar(10) DEFAULT NULL,
`Div2Airport` varchar(10) DEFAULT NULL,
`Div2AirportID` int(11) DEFAULT NULL,
`Div2AirportSeqID` int(11) DEFAULT NULL,
`Div2WheelsOn` varchar(10) DEFAULT NULL,
`Div2TotalGTime` varchar(10) DEFAULT NULL,
`Div2LongestGTime` varchar(10) DEFAULT NULL,
`Div2WheelsOff` varchar(10) DEFAULT NULL,
`Div2TailNum` varchar(10) DEFAULT NULL,
`Div3Airport` varchar(10) DEFAULT NULL,
`Div3AirportID` int(11) DEFAULT NULL,
`Div3AirportSeqID` int(11) DEFAULT NULL,
`Div3WheelsOn` varchar(10) DEFAULT NULL,
`Div3TotalGTime` varchar(10) DEFAULT NULL,
`Div3LongestGTime` varchar(10) DEFAULT NULL,
`Div3WheelsOff` varchar(10) DEFAULT NULL,
`Div3TailNum` varchar(10) DEFAULT NULL,
`Div4Airport` varchar(10) DEFAULT NULL,
`Div4AirportID` int(11) DEFAULT NULL,
`Div4AirportSeqID` int(11) DEFAULT NULL,
`Div4WheelsOn` varchar(10) DEFAULT NULL,
`Div4TotalGTime` varchar(10) DEFAULT NULL,
`Div4LongestGTime` varchar(10) DEFAULT NULL,
`Div4WheelsOff` varchar(10) DEFAULT NULL,
`Div4TailNum` varchar(10) DEFAULT NULL,
`Div5Airport` varchar(10) DEFAULT NULL,
`Div5AirportID` int(11) DEFAULT NULL,
`Div5AirportSeqID` int(11) DEFAULT NULL,
`Div5WheelsOn` varchar(10) DEFAULT NULL,
`Div5TotalGTime` varchar(10) DEFAULT NULL,
`Div5LongestGTime` varchar(10) DEFAULT NULL,
`Div5WheelsOff` varchar(10) DEFAULT NULL,
`Div5TailNum` varchar(10) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=58592318 DEFAULT CHARSET=latin1 COMMENT='columnar=1'
次のSQL文を実行します。
SELECT * FROM ontime ORDER BY ArrTime LIMIT 1000;
次の表に、IMCIまたはハイブリッドプラン機能が使用されていない、IMCIのみが使用されている、およびハイブリッドプラン機能が使用されているシナリオで、コールドスタート時にクエリを実行するのに必要な時間を示します。
IMCIまたはハイブリッドプラン機能は使用されません | IMCIのみが使用されます | ハイブリッドプラン機能が使用されている |
232.48秒 | 2.56秒 | 0.33秒 |
上記の表に基づいて、ハイブリッドプラン機能はワイドテーブルでのクエリを大幅に高速化できます。