このトピックでは、並列クエリの制限と、並列実行と直列実行の結果の間に起こりうる不一致について説明します。
並列クエリの制限
PolarDBは、並列クエリ機能を継続的に改善します。 この機能は、次の状況ではパフォーマンスを向上できません。
非Innodbテーブルのクエリ。
フルテキストインデックスを使用するクエリ。
リーダーによって実行されなければならないストアドプロシージャ。
INDEX-MERGE結合を使用してスキャンされるテーブル。
シリアル化可能なトランザクションのクエリ。
挿入... SELECTとREPLACE... 分離レベルがRepeatable Readの場合のトランザクションのSELECTステートメント。
並列実行とシリアル実行の結果の不一致
エラーメッセージの数が増えることがあります。
ステートメントにシリアル実行を使用し、エラーメッセージが発生すると仮定します。 同じステートメントに対して並列実行を使用すると、さらにエラーメッセージが返される可能性があります。
精度の問題が発生する可能性があります。
シリアル実行の場合、中間結果を格納する必要はない。 並列実行では、中間結果を格納する必要があります。 中間結果が浮動小数点数である場合、浮動小数点数の精度は、並列実行の精度とは異なる可能性がある。 これにより、並列実行と直列実行の結果に違いが生じる可能性があります。
ネットワークパケットまたは中間結果のサイズが、max_allowed_packetパラメーターで指定された上限を超えています。
連続実行の場合、中間結果は生成されない。 並列実行のために、中間結果が生成され得る。 中間結果のサイズがmax_allowed_packetパラメーターで指定された上限を超えると、エラーメッセージが返される場合があります。 この問題を解決するには、max_allowed_packetパラメーターの値を増やします。 パラメーターの変更方法の詳細については、「クラスターパラメーターとノードパラメーターの指定」をご参照ください。
並列実行のための結果セットの順序は、直列実行のためのものと異なってもよい。
SELECT... ORDER BYキーワードを含まない
ステートメントが並列に実行されると、返された結果セットの順序が実行順序と一致しない可能性があります。 複数のワーカーが同時に実行されます。 したがって、各実行中のワーカーの実行速度は不確実である。 リーダーが十分なデータを取得すると、最終結果が返されます。 その結果、返された結果セットの順序が実行順序と一致しない場合があります。行ロックを持つデータレコードの数が増加します。
SELECT... FROM ... SHARE
ステートメントが並列に実行される場合、InnoDBはアクセスされるデータの各行をロックします。 したがって、行ロックを有するレコードの数は、非並列実行の場合よりも多くなる可能性がある。 この現象は、並列実行の場合には正常である。