サポートされる問合せ構成と問合せ形態の例

Oracle Globally Distributed Databaseでは、単一シャード問合せとマルチシャード問合せの形式がサポートされていますが、いくつかの制限事項があります。

Oracle Globally Distributed Databaseでの問合せコンストラクトに関する制限事項は次のとおりです。

  • CONNECT BYを使用する問合せ CONNECT BYを使用する問合せはサポートされません。

  • MODEL句 MODEL句はサポートされていません。

  • WHERE句のユーザー定義のPL/SQL マルチシャード問合せでは、ユーザー定義のPL/SQLはSELECT句でのみ使用できます。WHERE句で指定された場合は、エラーがスローされます。

  • XLATEおよびXML問合せタイプ XLATEおよびXML問合せタイプの列はサポートされません。

  • オブジェクト型 オブジェクト型をSELECTリスト、WHERE句などに含めることはできますが、オブジェクト型のカスタム・コンストラクタおよびメンバー関数をWHERE句に含めることはできません。

    さらに、重複表の場合、NOT FINAL型(つまりNOT FINALキーワードを指定して作成されたオブジェクト型)は、列のデータ型として使用できません。シャード表の場合、NOT FINAL型を列のデータ型として使用できますが、キーワードNOT SUBSTITUTABLE AT ALL LEVELSを指定して列を作成する必要があります。

ノート:

重複表のみに関連する問合せは、コーディネータで実行されます。

次のトピックでは、Oracle Globally Distributed Databaseでサポートされる問合せ形式の例をいくつか示します。

シャード表のみに対する問合せ

単一表の問合せの場合、問合せにはシャードを限定するシャーディング・キーに対する等価フィルタを指定できます。結合問合せの場合は、すべての表がシャーディング・キーに対する等価フィルタを使用して結合される必要があります。

次の例は、シャード表のみが関与する問合せを示しています。

例8-1 内部結合

SELECT … FROM s1 INNER JOIN s2 ON s1.sk=s2.sk 
WHERE any_filter(s1) AND any_filter(s2)

例8-2 左外部結合

SELECT … FROM s1 LEFT OUTER JOIN s2 ON s1.sk=s2.sk

例8-3 右側外部結合

SELECT … FROM s1 RIGHT OUTER JOIN s2 ON s1.sk=s2.sk

例8-4 完全外部結合

SELECT … FROM s1 FULL OUTER JOIN s2 ON s1.sk=s2.sk
WHERE any_filter(s1) AND any_filter(s2)

シャード表および重複表の両方が関係する問合せ

シャード表と重複表が関係する問合せは、シャーディング・キーに対する述語に応じて、単一シャード問合せまたはマルチシャード問合せになります。唯一の違いは、問合せに非シャード表が含まれていることです。

ノート:

シャード表と重複表の結合では、任意の列で、任意の比較演算子(= < > <= >=)または任意の結合式を使用できます。

例8-5 内部結合

SELECT … FROM s1 INNER JOIN r1 ON any_join_condition(s1,r1) 
WHERE any_filter(s1) AND any_filter(r1)

例8-6 左外部結合または右外部結合

この場合、シャード表はLEFT OUTER JOINの最初の表です。

SELECT … FROM s1 LEFT OUTER JOIN r1 ON any_join_condition(s1,r1) 
WHERE any_filter(s1) AND any_filter(r1)

SELECT … FROM r1 LEFT OUTER JOIN s1 ON any_join_condition(s1,s2) 
AND any_filter(r1) AND filter_one_shard(s1)

この場合、シャード表はRIGHT OUTER JOINの2番目の表です。

SELECT … FROM r1 RIGHT OUTER JOIN s1 ON any_join_condition(s1,r1) 
WHERE any_filter(s1) AND any_filter(r1)

SELECT … FROM s1 RIGHT OUTER JOIN r1 ON any_join_condition(s1,s2) 
AND filter_one_shard(s1) AND any_filter(r1)

場合によっては、重複表がLEFT OUTER JOINの最初の表であるか、シャード表が最初の表でシャーディング・キーに対するフィルタ述語に基づいて単一のシャードにマップされます。

SELECT … FROM r1 LEFT OUTER JOIN s1 ON any_join_condition(s1,s2) 
AND any_filter(r1) AND any_filter(s1)

場合によっては、重複表がRIGHT OUTER JOINの2番目の表であるか、シャード表が2番目の表でシャーディング・キーに対するフィルタ述語に基づいて単一のシャードにマップされます。

SELECT … FROM s1 RIGHT OUTER JOIN r1 ON any_join_condition(s1,s2) 
AND any_filter (s1) AND any_filter(r1)

例8-7 完全外部結合

SELECT … FROM s1 FULL OUTER JOIN r1 ON s1.sk=s2.sk
WHERE any_filter(s1) AND any_filter(s2)

この場合、シャード表で複数のシャードへのアクセスが必要となります。

SELECT … FROM s1 FULL OUTER JOIN r1 ON s1.non_sk=s2.non_sk
WHERE any_filter(s1) AND any_filter(s2)

例8-8 セミ結合(EXISTS)

SELECT … FROM s1 EXISTS 
(SELECT 1 FROM r1 WHERE r1.anykey=s1.anykey)

SELECT … FROM r1 EXISTS 
(SELECT 1 FROM s1 WHERE r1.anykey=s1.anykey and filter_one_shard(s1))

この場合、シャード表は複数シャードの関与を必要とする副問合せにあります。

SELECT … FROM r1 EXISTS 
(SELECT 1 FROM s1 WHERE r1.anykey=s1.anykey)

例8-9 アンチ結合(NOT EXISTS)

SELECT … FROM s1 NOT EXISTS 
(SELECT 1 FROM r1 WHERE r1.anykey=s1.anykey)	

この場合、シャード表は副問合せにあります。

SELECT … FROM r1 NOT EXISTS 
(SELECT 1 FROM s1 WHERE r1.anykey=s1.anykey

サポートされる集計関数

次の集計は、Oracle Globally Distributed Databaseでのプロキシ・ルーティングによってサポートされます。

  • COUNT

  • SUM

  • MIN

  • MAX

  • AVG

ユーザー定義型を使用した問合せ

ユーザー定義のSQLオブジェクト型とSQLコレクション型は、ユーザー定義型と呼ばれます。Oracle Globally Distributed Databaseでは、ユーザー定義型を使用した問合せがサポートされます。

例8-10 ユーザー定義型を持つ表の作成

次の例では、全シャード・タイプおよびタイプ本体を作成し、そのタイプを参照するシャード表を作成します。

ALTER SESSION ENABLE SHARD DDL;

CREATE OR REPLACE TYPE person_typ AS OBJECT (
    first_name   VARCHAR2(20),
    last_name    VARCHAR2(25),
    email        VARCHAR2(25),
    phone        VARCHAR2(20),
    MEMBER FUNCTION details (
    self IN person_typ
    ) RETURN VARCHAR2
);
/

CREATE OR REPLACE TYPE BODY person_typ AS
    MEMBER FUNCTION details (
    self IN person_typ
    ) RETURN VARCHAR2 IS
        result VARCHAR2(100);
    BEGIN
        result := first_name || ' ' || last_name || ' ' || email || ' ' || phone;
        RETURN result;
    END;
END;
/

CREATE SHARDED TABLE Employees
( Employee_id      NUMBER NOT NULL
, person      person_typ
, signup_date DATE NOT NULL
, CONSTRAINT RootPK PRIMARY KEY(CustNo)
)
PARTITION BY CONSISTENT HASH (CustNo)
PARTITIONS AUTO
TABLESPACE SET ts1
;

例8-11 型コンストラクタを使用したデータの挿入

INSERT INTO Employees values ( 1, person_typ('John', 'Doe', 'jdoe@example.com', '123-456-7890'), to_date('24 Jun 2020', 'dd Mon YYYY'));

例8-12 ユーザー定義型の列のマルチシャード問合せ

SELECT e.person FROM Employees e;


SELECT e.person.first_name, e.person.last_name FROM Employees e;


SELECT e.person.details() FROM Employee e where e.person.first_name = 'John’;

 
SELECT signup_date from Employees e where e.person = person_typ('John', 'Doe', 'jdoe@example.com', '123-456-7890’);

プロキシ・ルーティング用の実行計画

マルチシャード問合せでは、各シャードで別個の実行計画が生成されます。この実行計画はデータのサイズに応じて最適化され、シャードで使用可能なリソースが計算されます。

SQLフラグメントの実行計画を参照するために、個々のシャードに接続する必要はありません。dbms_xplan.display_cursor()で提供されるインタフェースは、シャードで実行されたSQLセグメントの計画をコーディネータに表示します。また、[V/X]$SHARD_SQLは、マルチシャード問合せのシャードSQLフラグメントをターゲットのシャード・データベースに一意にマップします。

dbms_xplan.display_cursor()のSQLセグメント・インタフェース

2つのインタフェースを使用して、シャードで実行されたSQLセグメントの計画を表示できます。これらのインタフェースは、引数としてシャードIDを取り、指定されたシャードの計画を表示します。ALL_SHARDS形式では、すべてのシャードの計画が表示されます。

シャードのすべての計画を出力するには、次に示すようにformatALL_SHARDSを使用します。

select * from table(dbms_xplan.display_cursor(sql_id=>:sqlid,
                                              cursor_child_no=>:childno,
                                              format=>'BASIC +ALL_SHARDS‘,
                                              shard_ids=>shard_ids))

シャードの計画を選択して出力するには、display_cursor()関数内でシャードIDを渡します。複数のシャードの計画を出力する場合は、次に示すようにshard_idsパラメータでシャードIDを含む数値の配列を渡します。

select * from table(dbms_xplan.display_cursor(sql_id=>:sqlid, 
                                               cursor_child_no=>:childno,
                                               format=>'BASIC',
                                               shard_ids=>ids))

1つのシャードの計画を返すには、次に示すようにshard_idパラメータにシャードIDを直接渡します。

select * from table(dbms_xplan.display_cursor(sql_id=>:sqlid,
                                              cursor_child_no=>:childno,
                                              format=>'BASIC',
                                              shard_id=>1))

V$SQL_SHARD

V$SQL_SHARDは、マルチシャード問合せのシャードSQLフラグメントをターゲットのシャード・データベースに一意にマップします。このビューは、特定のマルチシャード問合せのシャードSQLフラグメントごとにアクセスされたシャードのリストがシャード・コーディネータ・データベースに格納されている場合にのみ関連します。マルチシャード問合せが実行されるたびに、異なるシャード・セットでシャードSQLフラグメントを実行できるため、実行されるたびにシャードIDが更新されます。このビューには、各リモート・ノードのシャードSQLフラグメントのSQL IDと、シャードSQLフラグメントが実行されたシャードIDが保持されています。

Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
 SQL_ID                                            VARCHAR2(13)
 CHILD_NUMBER                                      NUMBER
 NODE_ID                                           NUMBER
 SHARD_SQL_ID                                      VARCHAR2(13)
 SHARD_ID                                          NUMBER
 SHARD_CHILD_NUMBER                                NUMBER
  • SQL ID - コーディネータ上のマルチシャード問合せのSQL ID

  • CHILD_NUMBER - コーディネータ上のマルチシャード問合せのカーソル子番号

  • NODE - マルチシャード問合せのシャードSQLフラグメントのリモート・ノードのID

  • SHARD_SQL_ID - 指定されたリモート・ノードIDに対するシャードSQLフラグメントのSQL ID

  • SHARD_ID - シャードSQLフラグメントが実行されたシャードのID

  • SHARD_CHILD_NUMBER - シャードに対するシャードSQLフラグメントのカーソル子番号(デフォルトは0)

分散データベースに対するマルチシャード問合せと実行計画の例を次に示します。

SQL> select count(*) from departments a where exists (select distinct department_id
 from departments b where b.department_id=60);
------------------------------------------------
| Id  | Operation          | Name              |
------------------------------------------------
|   0 | SELECT STATEMENT   |                   |
|   1 |  SORT AGGREGATE    |                   |
|   2 |   FILTER           |                   |
|   3 |    VIEW            | VW_SHARD_377C5901 |
|   4 |     SHARD ITERATOR |                   |
|   5 |      REMOTE        |                   |
|   6 |    VIEW            | VW_SHARD_EEC581E4 |
|   7 |     SHARD ITERATOR |                   |
|   8 |      REMOTE        |                   |
------------------------------------------------

V$SQL_SHARDビューに対するSQL_IDの問合せ。

SQL> Select * from v$sql_shard where SQL_ID = ‘1m024z033271u’;
SQL_ID        NODE_ID   SHARD_SQL_ID  SHARD_ID
------------- -------  -------------- --------
1m024z033271u       5   5z386yz9suujt        1
1m024z033271u       5   5z386yz9suujt       11 
1m024z033271u       5   5z386yz9suujt       21 
1m024z033271u       8   8f50ctj1a2tbs 	    11