述語のプッシュダウン

問合せのパフォーマンスが向上するように、Apache Hiveでは述語のプッシュダウンと呼ばれるメカニズムがサポートされています。このメカニズムでは、特定の問合せのクライアント側フロントエンド処理によって、問合せのWHERE句(述語)が列情報および対応する比較演算子に分解され、データベースのサーバー側バックエンドで実行可能なデータベースに対して結果のコンポーネントが渡されます(プッシュされます)。同様のパフォーマンス向上を実現するために、Oracle NoSQL Database表APIのHive統合クラスでは、Oracle NoSQL Database表のデータに対してHiveまたはBig Data SQL問合せを実行する際に、同様の述語のプッシュダウン機能がサポートされています。たとえば、このドキュメントで前述したスキーマを持つvehicleTableの例に対して実行される次の問合せを考えてみます。

SELECT * FROM vehicleTable WHERE \
    type = 'auto' AND make = 'Chrysler' AND \
    model >= 'Imperial' AND model < 'Sebring';

この問合せでは、Chrysler社製の自動車(トラックやSUVではなく)で、モデルが'Imperial'、' Lebaron'または'PTCruiser'であり、'Sebring'ではない、対応するすべての行が返されます。この問合せの実行時に述語のプッシュダウンが使用されないと、vehicleTableのすべての行がストアのバックエンド・データベースから取得され、フロントエンド・クライアントに戻されます。そのクライアントで述語情報が適用され、戻された行で目的の一致が検索されます。一方、述語のプッシュダウンが使用されている場合は、WHERE句の情報がストアに送信され、すべてのフィルタ処理がデータベース自体で実行されるため、述語に一致する表の行のみがクライアントに戻されます。述語のプッシュダウンを使用できる場合は、パフォーマンスが大幅に向上する可能性があります。

このドキュメントに示されている例では、表の問合せ時に使用できる様々な述語を事実上無制限にできます。したがって、バックエンドのOracle NoSQL Databaseストアに実際にプッシュできる述語は、可能性のあるすべての述語の有限サブセットに制限されていることを理解することが重要です。これは、Oracle NoSQL Databaseでサポートできる述語が、Hiveでの述語のプッシュダウン・メカニズムでサポートされるものに依存するのみでなく、Oracle NoSQL Database表APIのセマンティクスにも依存するためです。その結果として、表API Hive統合クラスの述語のプッシュダウン・メカニズムでサポートされている演算子が、現在は次のものに制限されています。

=   <   <=   >   >=   AND   OR   IN

前述の一連の演算子に加えて、表APIのセマンティクスも、述語のプッシュダウン時の表のフィールド(列)の処理方法に影響を与える可能性があります。具体的には、特定の問合せの述語について、有効な主キー、索引キーまたはフィールド範囲(表APIで定義)、あるいはその組合せをその述語のフィールドのすべてまたはサブセットから形成できず、Oracle NoSQL DatabaseのSQLで提供されるフィルタ・メカニズム(SQLビギナーズ・ガイド結果のフィルタ処理に関する項を参照)を使用して述語のいずれの部分もサーバーにプッシュできない場合、問合せの述語は分解されず、バックエンドでのフィルタ処理用にデータベースに送信されることはありません。かわりに、システムではデフォルトのメカニズムにフォールバックし、クライアント側ですべてのフィルタ処理を実行して、指定された表のすべての行に述語を適用します。

たとえば、前述の問合せについて考えてみます。その問合せでは、述語の各コンポーネントがプッシュダウンに必要な基準を満たしているため、述語全体が検索処理のためにデータベースにプッシュされます。これを理解するために、最初に、問合せの述語で参照される演算子が前述のセットに属している(つまり、'='、'AND '、'>='、'<')ことを確認します。

次に、vehicleTableのスキーマに基づいて、typeおよびmakeという名前のフィールドで、表スキャンを実行するための有効な主キーを形成し、modelという名前のフィールドを参照する述語コンポーネントで有効なフィールド範囲を形成します。これを次のような問合せと比較します。

SELECT * FROM vehicleTable WHERE make = 'Chrysler' AND \   
    model >= 'Imperial' AND model < 'Sebring';

この問合せに形式(make、model)の索引がない場合、キーの最初のフィールドがないと、表APIのセマンティクスで必要な有効な主キーの構成が妨げられますが、述語はOracle NoSQL Databaseフィルタ処理メカニズムのSQLによるフィルタ処理に有効とみなされるため、バックエンド・ストアにプッシュできます。最後に、次のような問合せについて考えてみます。

SELECT * FROM vehicleTable WHERE model LIKE "%Silverado%";

この問合せでは、述語のプッシュダウンはバイパスされ、すべてのフィルタ処理がクライアント側で実行されます。これは、現在述語のプッシュダウンに適格でないLIKE演算子が、述語で使用されているためです。

提示した最初の2つの例の問合せは、両方とも述語全体がプッシュされ、すべてのフィルタ処理がバックエンドで実行されます。一方、3番目の例の問合せでは述語のプッシュダウンは行われず、すべてのフィルタ処理がクライアント側で実行されます。

これは、述語のプッシュダウンが常にこのようなオール・オア・ナッシングの方法で処理されることを意味するものではありません。反対に、多くの問合せでは、述語の一部のみがデータベースにプッシュされ、最初のフィルタ処理結果が生成され、その後、クライアント側で述語の残りの(残差)部分を使用してさらにフィルタ処理されます。

たとえば、色が'blue'、'red'または'yellow'で、モデル名が文字'E'で始まる(Equinox、Expedition、Explorerなど)データベース内の各'4WheelDrive'車両を検索する問合せを考えてみます。このような問合せは次のようになります。

SELECT * FROM vehicleTable WHERE \
    class = '4WheelDrive' AND \
    color IN ('blue','red','yellow') AND \
    model LIKE '%E%';

次の項に示されている基準に基づいて、バックエンドにプッシュできない問合せの述語の唯一のコンポーネントはLIKE演算子(model LIKE '%E%')を使用するコンポーネントで、問合せ内の他のすべてのコンポーネントはプッシュの対象です。したがって、指定された問合せを実行すると、コンポーネント"class = '4WheelDrive' AND color IN ('blue', 'red', 'yellow')"で構成される述語の一部がバックエンドにプッシュされ、青、赤または黄色の四輪駆動車のすべてを参照する行が生成されます。その後、クライアントは残りの述語(model LIKE '%E%')をバックエンドからの結果に適用して、モデル名に大文字の「E」がある行のみを選択して返します。