0

MemSQL を使用して、データに対するスクリーニング機能を提供することを検討しています。スクリーニング操作には、任意の数の基準 (Oracle または MySQL の「動的 SQL」を使用して対処する可能性が最も高い要件のタイプ) を含めることができます。

この種の任意のスクリーニングは MemSQL にとって問題になるでしょうか? MemSQL のこの FAQは、クエリのコンパイルに時間がかかることを示唆しています。MemSQL が新しい WHERE 句を検出するたびに、新しい C++ フラグメントをコンパイルする必要があるということですか? もしそうなら、そのコンパイルはどのくらいの遅延をもたらしますか?

ありがとう。

4

1 に答える 1

1

そうです、FAQ で説明されているように、唯一の違いがパラメーターの値でない限り、新しい WHERE 句ごとにクエリのコンパイルが必要になります。(これは、where 句で使用可能なフィルターに基づいてプランをコンパイルおよび最適化するためです。) したがって、新しいフィルターを追加すると、別のコンパイルが必要になります。memsql の現在のリリースでは、クエリによっては、選択クエリのコンパイルに 1 秒以上かかる場合があります。

これを回避するための 1 つの回避策は、関心のあるすべての可能な基準を事前に知っている場合、WHERE 句を次のように記述することです。

WHERE (a=1 OR 0) AND (b<5 OR 0) AND (c=3 OR 0)

これはと同等です

WHERE (a=1) AND (b<5) AND (c=3)

もちろん、これらのフィルターは任意の式にすることができます。OR 0 を OR 1 に変更すると、その条件は無視されます。たとえば、b<5 だけを取得するには、次のように記述します。

WHERE (a=1 OR 1) AND (b<5 OR 0) AND (c=3 OR 1)

パラメータのみが変更されるため、追加のコンパイルは必要ありません。ただし、コンパイルされたクエリ プランは実行時にこれらの各句をチェックする必要があり (この回避策で再コンパイルを回避する方法です)、実際に存在するフィルターによって最適なプランが異なる可能性があるため、パフォーマンスが低下する可能性があることに注意してください。

于 2015-12-09T20:27:24.453 に答える