Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » リモート・データとバルク・オペレーション » リモート・データへのアクセス » 内部オペレーション

 

文の部分的なパススルー

ある文に複数のサーバへの参照が含まれている場合、またはリモート・サーバではサポートされていない SQL 機能を文が使用している場合は、クエリは複数の単純な部分に分解されます。

SELECT

引き渡すことのできない部分が取り除かれながら、SELECT 文は分解されていきます。取り除かれた部分の処理は SQL Anywhere によって実行されます。たとえば、次の文内にある ATAN2 関数をリモート・サーバが処理できないとします。

SELECT a,b,c
WHERE ATAN2( b, 10 ) > 3
AND c = 10;

リモート・サーバに送信される文は、次のように変換されます。

SELECT a,b,c WHERE c = 10;

次に、SQL Anywhere がローカルで WHERE ATAN2( b, 10 ) > 3 を中間結果セットに適用します。

ジョイン

2 つのテーブルがジョインされると、1 つは外部テーブルとなります。外部テーブルは、テーブルに適用する WHERE 条件に基づいてスキャンされます。検出される条件に合うどのローに対しても、内部テーブルとして認識されるもう 1 つのテーブルがスキャンされ、ジョイン条件に一致するローを検出します。

リモート・テーブルが参照されるときにも同じアルゴリズムが使用されます。通常は、ローカル・テーブルよりリモート・テーブルを検索する方がコストがかかるので (ネットワーク I/O のため)、できるかぎりリモート・テーブルをジョインの一番外側のテーブルにします。

UPDATE と DELETE

条件に合うローが検出されたとき、SQL Anywhere が UPDATE 文または DELETE 文全体をリモート・サーバに渡すことができない場合は、元の WHERE 句のできるだけ多くの部分を持つ SELECT 文に文を変更して、WHERE CURRENT OF cursor-name を指定する位置付け UPDATE 文または DELETE 文を続けます。

たとえば、リモート・サーバが関数 ATAN2 をサポートしていないとします。

UPDATE t1
SET a = atan2( b, 10 )
WHERE b > 5;

この文は次のように変換されます。

SELECT a,b
FROM t1
WHERE  b > 5;

ローが検出されるたびに、SQL Anywhere は a の新しい値を計算して、次の文を発行します。

UPDATE t1
SET a = 'new value'
WHERE CURRENT OF CURSOR;

new value と等しい値が a にある場合、位置付け UPDATE は必要なく、リモートに送信されません。

テーブル・スキャンを必要とする UPDATE 文または DELETE 文を処理するには、位置付け UPDATE または DELETE (WHERE CURRENT OF cursor-name) を実行する機能をリモートのデータ・ソースがサポートしていなければなりません。データ・ソースによってはこの機能をサポートしていません。

テンポラリ・テーブルは更新できない

中間テンポラリ・テーブルが必要な場合は、UPDATE または DELETE を実行できません。これは ORDER BY を持つクエリと、サブクエリを持つクエリのいくつかで発生します。