タイトル: SQL クエリ: 動作と使用法の概要 description: すべての SQL クエリ演算子と句について学びます。 NCache サポートと、それらがキャッシュ管理において果たす役割。
正規: https://www.alachisoft.com/resources/docs/ncache/prog-guide/sql-ncache.html
SQL クエリ: 動作と使用法の概要
NCache すべての新しいオブジェクトが一意のキーに対して格納されるキー値キャッシュです。 主キーがデータを検索するリレーショナル データベースと同様に、 NCache 対応するキーを指定して、そのデータを取得できます。 ただし、多くの実用的なシナリオでは、主キーだけでなく、さまざまな属性に基づいてデータを取得するために柔軟に検索する機能が必要です。 トランザクションの多いアプリケーションのほとんどはデータをキャッシュに保持するため、データをクエリできる機能は非常に望ましいものです。
SQL クエリ: キャッシュ内でのクエリの重要性
カテゴリ、価格、重量などのさまざまな基準に基づいて製品がクエリされる電子商取引 Web サイトがあると仮定します。アプリケーションのパフォーマンスを向上するには、分散キャッシュ システムを使用することが適切なソリューションであると思われます。 ただし、クエリ機能を失ったり、アプリケーションを書き換えたりすることは許容できません。
そのようなシナリオでは、 NCache は、クエリ機能を損なうことなくアプリケーションのパフォーマンスを拡張できる理想的な分散キャッシュです。 具体的には、 NCache あなたがすることができます キャッシュされたデータのクエリ SQL に似たクエリ構文を使用して、さまざまな属性に基づいています。 採用することで NCache 前述のシナリオでは、カテゴリ、価格、または重量を条件として使用して、すべての製品をクエリできます。
Note
NCache SQL に似たクエリ構文を使用して、キャッシュ内のデータを検索および削除できます。
NCache 取得する柔軟性を提供します 予測、オブジェクト全体、キャッシュキーのみ、または要件に基づいたキーと値のペア自体。 さらに、 NCache また、 基本的なクエリ演算子, 論理演算子, 集計関数 SQLによって提供されます。
仕組み
In NCache、パーティショニングにより、データは異なるクラスター ノードに分散されます。顧客が 1,000 人いる場合、ID を使用して顧客を検索するのは十分に簡単です。ただし、レコードがさまざまなノードに分散されており、クエリ基準が任意の顧客属性になる可能性がある場合、100 万件に 1 件を見つけることはそれほど複雑ではありません。このコンテキストでは、キャッシュ内のクエリには効率的なデータ検索メカニズムが必要です。
特に、 NCache 従業員 インデキシング & 分散クエリ キャッシュ内でリアルタイムの SQL のような検索機能をサポートします。 インデックスを作成すると、キャッシュ内で属性を検索できるようになります。 項目がインデックスに対して追加されると、その項目はクライアントが接続されているノードのクエリ結果として返されます。 一方、Partitioned Topology でデータが分散されている場合、クエリは分散的に実行されます。
重要
キャッシュ内で検索できるようにするには、属性にインデックスを付ける必要があります。
インデキシング
従来のデータベースは、インデックスを使用してクエリのパフォーマンスを向上させます。 しかし、 NCache 使用されます インデキシング SQL のようなクエリによる検索を可能にするために必須です。 キャッシュ データをクエリするには、最初にすべての検索可能な属性にインデックスを付ける必要があります。 プロジェクションと基準で指定されたフィールドにはインデックスを付ける必要があることに注意することが重要です。 属性にインデックスが定義されると、キャッシュに追加された関連データには自動的にインデックスが付けられ、検索可能になります。 したがって、インデックスは一度定義すれば十分です。
Note
インデックス作成により、読み取り操作ははるかに高速になりますが、書き込み操作ごとにオーバーヘッドが発生します。
NCache パフォーマンス指向のアプローチであるため、インデックス作成を使用します。 インデックスを作成すると、クエリ結果セットを検索するときにキャッシュ内のすべてのエントリをクエリする必要がなくなります。 これにより、検索メカニズムが迅速化され、時間と計算能力が節約されます。
警告
メモリとパフォーマンスのオーバーヘッドが発生するため、不要なフィールドにインデックスを付けないでください。
分散クエリ
で実行されたクエリ NCache キャッシュ トポロジと基になるクライアント接続によって異なります。 ミラー化または複製されたトポロジの場合、クエリはクライアントが接続するノードでのみ実行されます。 ただし、クラスタ ノード間でデータが分割されている場合、これは発生しません。
上のクエリ パーティション化されたクラスター 主にデータのパーティショニングにより、分散方式で実行されます。 クライアントはすべてのクラスター ノードに接続するため、クエリは各ノードで個別に実行されます。 必要なデータで構成される結果セットが各ノードから返され、最終結果をクライアントに返す前にマージされます。 ここで、パフォーマンスはクラスター ノードの数と各ノードから返される結果セットのサイズにも依存します。
Note
の分散クエリ NCache 非常にスケーラブルです。
分散クエリは、より高いスケーラビリティをもたらします NCache パーティション化されたデータとその並列実行が原因です。 新しいノードがクラスターに参加すると、各メンバーのパーティション化されたデータが減少します。 したがって、各サーバー ノードが費やすクエリ実行時間が短縮されます。 さらに、各ノードでの同時実行により、ネットワーク トラフィックも減少します。
SQLクエリ入力 NCache
NCache SQLのようなSELECTクエリとDELETEクエリをそれぞれ使用して、キャッシュデータを検索および削除できます。 INSERTおよびUPDATE操作は現在サポートされていません。 実行リーダー キャッシュ内で SELECT クエリを実行するために使用され、結果セットを のインスタンスに返します ICacheReader. 実行スカラー クエリを実行し、クエリによって返された結果セットの最初の行の最初の列を返します。追加の列または行は無視されます。
非クエリの実行 キャッシュからアイテムを削除するために使用されます。 クエリインデックスが定義されていれば、すべてのプリミティブデータ型とnull許容型をクエリできます。
重要
のインスタンスを必ず閉じてください ICacheReader
実行後、リソースをクリーンアップする必要があるため。
クエリ言語を使用すると、必要なデータに応じて非主キー基準を指定できます。 クエリを実行して、さまざまな予測と基準を使用してキャッシュ内のデータをクエリできます。 ただし、投影および基準で指定された属性にはインデックスを付ける必要があります。 さらに、要件に基づいて、キャッシュ キーのみを取得することも、指定されたクエリ基準を満たすアイテム全体を取得することもできる柔軟性があります。
インデックスタイプ
キャッシュ内の属性をクエリする場合は、まずその属性にインデックスを付ける必要があります。 NCache のためのいくつかの柔軟な方法を提供します インデキシング. 事前定義された (静的) インデックスの必要性を考慮して、 NCache 事前に検索可能な属性のインデックスを手動で定義できます。 静的インデックスを定義する XNUMX つの方法は、 の監視。 または、次のこともできます プログラムでインデックスを定義する.
一方、 動的インデックス グループ、タグ、名前付きタグなどは、実行時に属性に対して自動的に作成されます。 ランタイム インデックスを使用すると、論理グループ、タグ、および名前付きタグに基づいてキャッシュ内のデータをクエリできます。
SQL プロジェクションを使用したクエリ
NCache クエリに基づいて、クラスのすべてのインデックス付き属性または特定のプロジェクションをキャッシュストアから取得できます。 NCache 異なるサポート 予測 効率的な検索を容易にします。 プロジェクションは、クエリに関してアプリケーションのパフォーマンス向上において重要な役割を果たします。 たとえば、特定のカテゴリの製品の利用可能な単位列のみを取得したいとします。 その場合は、次の SELECT クエリを使用できます。
SELECT UnitsInStock FROM FQN.Product WHERE Category = "Sample_Category"
Note
完全なオブジェクトを返すにはコストがかかるため、パフォーマンスを向上させるには、必要な列のみをクエリすることをお勧めします。
必要な列のみを取得すると、インデックス付けされたすべての属性を取得するオーバーヘッドが追加されることに注意してください。 Product
クラスは避けられます。 この上、 NCache 改善されたクエリ構文により、ユーザーがパフォーマンスを向上させるのを容易にします。
キーとオブジェクトのクエリ
要件に基づいて、クエリでキャッシュ キーのみを取得するか、関連データを取得できます。 キーのみを列挙する必要がある場合は、 NCache キーのみを取得できます。これは、キャッシュからフェッチされるデータのサイズが大幅に減少するため、効率的なアプローチです。したがって、これを使用してパフォーマンスを向上させることができます。
ExecuteReader
オプションがあります getData
、キーの取得のみの場合は false に設定されます。デフォルトでは、その値は true です。さらに処理するためのデータが必要な場合は、デフォルト値を使用してオブジェクトをクエリできます。
サポートされているクエリ演算子
によって提供される豊富な演算子のセットを使用できます NCache キャッシュから目的の結果セットをフェッチするために必要なクエリ基準に従って。
次の演算子カテゴリがサポートされています NCache クエリ:
カテゴリー | 演算子 |
---|---|
基本的なクエリ演算子 | =、==、!=、<>、<、>、<=、> =、IN、LIKE、NOT LIKE |
論理演算子 | AND、OR、NOT |
集計関数 | 合計、カウント、平均、最小、最大 |
その他 | GROUP BY、ORDER BY、DateTime.Now、DateTime(「任意の日時互換文字列」) |
詳細については、 クエリ演算子 のセクションから無料でダウンロードできます。
クライアントキャッシュ
NCache を前提としています クライアントキャッシュ (L1 キャッシュ) には部分的なデータが含まれる場合があります。 L1 キャッシュでは完全なデータが保証されないことを考慮すると、クエリは常にサーバー キャッシュ (L2) で発生します。 NCache. クエリを実行するクライアント側で L1 キャッシュが有効になっている場合、クエリの実行動作は影響を受けません。 クエリはサーバー キャッシュ上で直接実行されます。 ただし、DELETE クエリによってクラスター化されたキャッシュ内のデータが変更されると、L1 は L2 キャッシュと同期します。
クライアント キャッシュはクエリの実行に影響しませんが、 NCache、パフォーマンスの向上に不可欠な役割を果たすことができます。 たとえば、クエリの結果セットに対してさらに操作を実行したいが、キャッシュからデータをフェッチすると、アプリケーションのパフォーマンスが低下する可能性があります。 クライアント キャッシュが L2 キャッシュで構成されている場合は、XNUMX つのコマンドで目的のデータを取得できます。 GetBulk
電話。 これにより、クライアント キャッシュ上で実行される操作が L2 キャッシュに比べてはるかに高速になるため、時間が節約され、パフォーマンスの低下が回避されます。