連合データベースに実行依頼される照会では、単一データ・ソースによって生成される結果を要求できます。しかし、通常は、複数のデータ・ソースによって生成される結果を要求します。通常の照会は複数のデータ・ソースに分散されるため、これは分散要求 と呼ばれます。
この節では、以下の事柄を扱います。
一般に、分散要求では 3 つの SQL 規則のうちの 1 つまたは複数を使用して、データの検索元、つまり、副照会、セット演算子、および結合副選択を指定します。この節では、次のようなシナリオでのコンテキストでの例を示します。ある連合サーバーが DB2 ユニバーサル・データベース (OS/390 版) データ・ソース、 DB2 ユニバーサル・データベース (AS/400 版) データ・ソース、および Oracle データ・ソースにアクセスできるように構成されています。それぞれのデータ・ソースには、従業員の情報を含む表が保管されています。この連合サーバーは、それらの表がある位置を示す通称によって表を参照します。表にはそれぞれ、UDB390_EMPLOYEES、AS400_EMPLOYEES、および ORA_EMPLOYEES という通称が付けられています。 (通称がデータ・ソースを参照する必要はありません。このシナリオの通称がデータ・ソースを参照するのは、表が異なる RDBMS にあることを強調しているにすぎません。) Oracle データ・ソースには、 ORA_EMPLOYEES に加えて、ORA_COUNTRIES という通称の表があります。ここには、従業員が住んでいる国についての情報が含まれています。
表 AS400_EMPLOYEES には、アジア在住の従業員の電話番号があります。また、電話番号に関連する国番号も含まれていますが、そのコードがどの国を表すかはリストされていません。しかし、表 ORA_COUNTRIES にはコードと国の両方がリストされています。次の照会では、副照会を使用して、中国の国別コードを検出します。さらに、SELECT および WHERE 文節を使用して、この特定のコードを必要とする電話番号を持つ従業員を AS400_EMPLOYEES にリストします。
SELECT name, telephone FROM djadmin.as400_employees WHERE country_code IN (SELECT country_code FROM djadmin.ora_countries WHERE country_name = 'CHINA')
連合サーバーは、以下の 3 つのセット演算子をサポートします。
このセット演算子を使用すると、 2 つ以上の任意の SELECT ステートメントに適合する行を結合できます。
このセット演算子を使用すると、最初の SELECT ステートメントに適合し、 2 番目のステートメントには適合しない行を検索できます。
このセット演算子を使用すると、両方の SELECT ステートメントに適合する行を検索できます。
3 つのすべてのセット演算子は、ALL オペランドを指定して、重複行が結果から削除されないように示すことができます。こうすると、余分な分類作業をする必要がなくなります。
以下の照会では、 AS400_EMPLOYEES および UDB390_EMPLOYEES 表の両方に存在するすべての従業員名および国別コードを検索します。これは、それぞれの表が異なるデータ・ソースにある場合でも実行されます。
SELECT name, country_code FROM as400_employees INTERSECT SELECT name, country_code FROM udb390_employees
関係結合では、複数の表から検索された列の組み合わせを含む結果セットを生成します。結果セットの行のサイズを制限する条件を指定しなければならないことに注意してください。
以下の照会では、2 つの表にリストされている国別コードを比較して、従業員の名前とそれに対応する国名を結合します。それぞれの表は異なるデータ・ソースにあります。
SELECT t1.name, t2.country_name FROM djadmin.as400_employees t1, djadmin.ora_countries t2 WHERE t1.country_code = t2.country_code
連合システムのユーザーは、 サーバー・オプション と呼ばれるパラメーターを使用して、データ・ソースに全体として適用される情報をグローバル・カタログに提供したり、 DB2 とデータ・ソースとの対話を制御したりできます。たとえば、データ・ソースの基本として使用できるインスタンスの識別子をカタログするには、データベース管理者はその識別子を値としてサーバー・オプション "node" に割り当てます。
サーバー・オプションの中には、 DB2 とデータ・ソースとの対話の主なエリアをアドレス指定するものがあります。これが照会の最適化です。たとえば、列オプション "varchar_no_trailing_blanks" を使用して、後書きブランクのない特定のデータ・ソース VARCHAR 列を DB2 最適化プログラムに通知できるのと同じように、サーバー・オプション (これも "varchar_no_trailing_blanks"と呼ばれる) を使用して、 VARCHAR 列に後書きブランクのないデータ・ソースを最適化プログラムに通知することができます。最適化プログラムがアクセス戦略を作成するのにこのような情報がどのように役立つかについての要約は、 表 27 を参照してください。
さらに、サーバー・オプション "plan_hints" を、 DB2 が Oracle データ・ソースにステートメント・フラグメントを提供することを可能にする値に設定できます。このステートメント・フラグメントは計画のヒント と呼ばれ、 Oracle 最適化プログラムがジョブを実行するための助けになります。特に、計画のヒントを使用すると、表にアクセスする際にどの索引を使用するか、およびデータから結果セットを検索する際にどの表結合順序列を使用するか、などの事柄を、最適化プログラムが決定するのに役立ちます。
通常は、データベース管理者が連合システムにサーバー・オプションを設定します。しかし、プログラマーは照会を最適化する助けとなるこれらのオプションを十分に活用できます。たとえば、データ・ソース ORACLE1 および ORACLE2 について、 plan_hints サーバー・オプションが省略時値の 'n' (いいえ、このデータ・ソースに計画のヒントを提供しません) に設定されているとします。また、ORACLE1 および ORACLE2 からのデータの分散要求を作成し、計画のヒントを使用して、それらのデータ・ソースでの最適化プログラムがこのデータにアクセスするための戦略を改善するとします。アプリケーションが連合データベースに接続されている間は、省略時値を 'y' (はい、計画のヒントを提供します) を設定して上書きできます。接続が完了すると、設定は自動的に 'n' に戻ります。
連合データベースへの接続の期間についてサーバー・オプションを設定するには、 SET SERVER OPTION ステートメントを使用します。設定を有効にするために、必ず CONNECT ステートメントの直後にこのステートメントを指定してください。さらに、ステートメントをすぐ指定できるように準備しておくことをお勧めします。
SET SERVER OPTION ステートメントについての資料は、 SQL 解説書 を参照してください。すべてのサーバー・オプションとそれらの設定の詳細については、 管理の手引き: インプリメンテーション を参照してください。